【问题标题】:How to inject @request_stack or @request in listener如何在监听器中注入@request_stack 或@request
【发布时间】:2015-06-20 17:58:29
【问题描述】:

我有这个监听器:

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\Request;

class ControllerListener
{
    public function onKernelController( FilterControllerEvent $event, Request $request )
    {
        if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
            $controllers = $event->getController();
            if (is_array( $controllers )) {
                $controller = $controllers[0];
                if (is_object( $controller )) {
                    if (method_exists( $controller, 'parControl' )) {
                        $controller->parControl(
                            $controller->getRequest(),
                            $controller->getRequest()->get( 'action' ),
                            $controller->getRequest()->get( 'context' ),
                            $controller->getRequest()->get( 'page' ),
                            $controller->getRequest()->get( 'case' ),
                            $controller->getRequest()->get( 'subset' )
                        );
                    }

                    if (method_exists( $controller, 'adminProjectControl' )) {
                        // to this method I need to pass Request $request  
                        $controller->adminProjectControl($request);
                    }

                    if (method_exists( $controller, 'accessControl' )) {
                        $controller->accessControl();
                    }
                }
            }
        }
    }

    public function onKernelResponse( FilterResponseEvent $event )
    {
        Utilities::flashDebugLoginMessage();
    }
}

它被定义为services.yml的服务:

pdone.listener.preexecute:
    class: GroupDCA\PDOneBundle\Listener\ControllerListener
    arguments: [@request]
    public: true
    scope: request
    tags:
        - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
        - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

但是我应该做错了,因为我得到了这三个错误:

ControllerListener.php 第 12 行中的 ContextErrorException:可捕获 致命错误:参数 2 传递给 GroupDCA\PDOneBundle\Listener\ControllerListener::onKernelController() 必须是 Symfony\Component\HttpFoundation\Request 的实例, 给定的字符串

ControllerListener.php 第 12 行中的 ContextErrorException:可捕获 致命错误:参数 2 传递给 GroupDCA\PDOneBundle\Listener\ControllerListener::onKernelController() 必须是 Symfony\Component\HttpFoundation\Request 的实例, 给定的字符串

bootstrap.php.cache 第 3118 行中的 LogicException:没有 "kernel.exception" 事件设置一个响应

那么,如何将请求注入到侦听器?我可以这样做吗?我也在这里阅读了this 的帖子,但不知道如何做到这一点。

【问题讨论】:

  • 每个监听器都传递了 3 个参数 - 被调度的事件对象 (FilterControllerEvent)、事件的名称 (kernel.controller) 和事件调度器 (@event_dispatcher) - 这就是为什么你收到第二个参数是字符串的错误,因为它是事件名称。如果您想要链接事件而不需要将@event_dispatcher 注入每个侦听器/订阅者,这将非常有用。

标签: php symfony dependency-injection symfony-2.7


【解决方案1】:

FilterControllerEvent已经gives you access to the request

public function onKernelController(FilterControllerEvent $event)
{
    $request = $event->getRequest();       

    // ...
}

如果您需要事件不提供请求的侦听器中的请求,请始终使用the request stack

use Symfony\Component\HttpFoundation\RequestStack;

class MyService
{
    private $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    public function doSomething()
    {
        $request = $this->requestStack->getCurrentRequest();

        // ...
    }
}

注入请求已被弃用,将被删除。 Request stack is the way to go。也不要使用 request 范围。

【讨论】:

    【解决方案2】:

    您将请求对象从服务定义传递给 ControllerListener 构造函数,而不是传递给 onKernelController 方法。

    改为:

    protected $request;
    
    public function __construct (Request $request) {
    
        $this->request = $request;
    }
    

    这应该可以解决您的问题并使请求对象可用。

    【讨论】:

    • 建议注入@request_stack而不是注入@request服务,然后通过$requestStack->getCurrentRequest()获取请求。这也意味着您不需要将服务范围更改为request
    • 这是错误的。您不应该像 Qoop 建议的那样直接注入请求。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2011-07-27
    • 2022-10-24
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多