【发布时间】: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