3

只是一个快速的问题。我正在构建一些 API。我正在考虑创建简单的父类来处理表单请求。

因此,例如,如果您想轻松处理表单请求,您只需扩展此类并访问请求对象、从该对象提取的请求数据以及开箱即用为您做一些事情的一堆方法。究竟是什么以及为什么并不重要。

问题是:

  1. 我通过邮递员发送请求。
  2. 我尝试在扩展父类的类中使用请求对象,但我得到的不是请求,而是 null。

我如何设置整个事情?:

现在在 Symfony 中,每个控制器默认注册为服务,所以我像这样覆盖这个定义:

#generic api form controller
    App\Controller\Api\ApiFormController:
      calls:
          - [setDependencies, ['@request_stack', '@App\Service\Serialization\Serializer']] 

如您所见,我正在使用 setter 注入。

我在我的其他课程中扩展了以上课程。我们称它为 PostController。所以:

<?php

namespace App\Controller\Api;

use Symfony\Component\HttpFoundation\RequestStack;

class ApiFormController
{
    /**
     * @var Request
     */
    public $request;

    /**
     * @param RequestStack $requestStack    
     */
    public function setDependencies(
        RequestStack $requestStack       
    ) {
        $this->request = $requestStack;       
    }
}

现在 PostController:

 public function get(int $post = null)
 {
   dump($this->request); exit;
 }

我期待获得这样的访问权限,并且我想我理解为什么我无法访问该对象。我正在寻找一些想法,如何以最干净的方式实现这一目标。我不期待现成的答案,而是提示。

我正在考虑使用事件在后台进行设置?我还认为这与我将控制器作为服务连接的方式有关。

4

3 回答 3

3

这一切的核心:Symfony 不为子类选择服务定义。因此,如果您为一个类定义依赖项并在另一个类中扩展它,那么您也必须为第二个类定义依赖项。

最简单的方法是为此使用parent关键字,因此您的示例将按以下方式工作:

App\Controller\Api\ApiFormController:
  calls:
      - [setDependencies, ['@request_stack', '@App\Service\Serialization\Serializer']]

PostController:
  parent: App\Controller\Api\ApiFormController
于 2017-12-17T16:12:13.110 回答
0

如果你使用自动装配,你可以使用 @required 让 Symfony 自动调用 setter。https://symfony.com/doc/current/service_container/autowiring.html#autowiring-other-methods-eg-setters

/**
 * @param RequestStack $requestStack
 * @required   
 */
public function setDependencies(
    RequestStack $requestStack       
) {
    $this->request = $requestStack;       
}

这应该可以解决问题。

于 2018-04-10T07:18:45.480 回答
-1

我在这里看到了几个问题。

  1. 如果你想以这种方式注入依赖项,你应该将控制器定义为服务。你可以在这里阅读更多。

路由应该是这样的:

# config/routes.yaml
get_something:
    path:     /
    defaults: { _controller: App\Controller\Api\PostController:get }

此外,您应该将 PostController 定义为服务,而不是 ApiFormController。

  1. 您注入了 RequestStack,但属性的类型提示是 Request。

代替:

$this->request = $requestStack;

你需要使用:

$this->request = $requestStack->getMasterRequest(); 
于 2017-12-17T15:02:48.190 回答