父类

时间:2017-12-17 13:06:24

标签: forms symfony dependency-injection request symfony4

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

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

问题是:

  1. 我通过邮递员发送请求。
  2. 我尝试在扩展父类的类中使用请求对象,而不是请求我得到null。
  3. 如何设置整个内容?:

    现在在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;
     }
    

    我希望能够像这样访问,我想我明白为什么我无法访问这个对象。我正在寻找一些有关如何以最清洁的方式实现这一目标的想法。我不期待现成的答案,但提示。

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

3 个答案:

答案 0 :(得分:2)

这一切的核心:Symfony没有为子类选择服务定义。因此,如果您为类定义依赖项并将其扩展到另一个类中,则还必须为此第二个类定义依赖项。

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

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

PostController:
  parent: App\Controller\Api\ApiFormController

答案 1 :(得分:0)

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

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

这应该可以解决问题。

答案 2 :(得分:-1)

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

  1. 如果要以这种方式注入依赖项,则应将控制器定义为服务。您可以阅读更多here
  2. 路由应该是这样的:

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

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

    1. 您注入了RequestStack,但该属性的类型提示为Request。
    2. 而不是:

      $this->request = $requestStack;
      

      您需要使用:

      $this->request = $requestStack->getMasterRequest();