我听了kernel.controller动作来实现我的控制器的默认(或初始化)动作:
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
$currentController = $controller[0];
if($controller[0] instanceof Initmethod){
$ret = $currentController->init($event->getRequest());
if($ret !== null && $ret instanceof Response){
$ret->send();
exit();
}
}
$event->setController($controller);
}
正如您所看到的,我想让我的init操作能够返回应该发送的响应而不是被调用的动作。之后,不应执行任何其他操作。
我的问题是,我这样做的方式是正确的吗?因为不想“打架”并通过调用exit来结束执行似乎不对。
答案 0 :(得分:1)
您可以将控制器的init
方法设置为当前可调用方法,例如
$initController = array($currentController, 'init');
$event->setController($initController);
然后Symfony将处理默认控制器方法的init
方法并返回响应(如果存在)。我假设您要在init
方法返回null
时调用默认控制器方法。在这种情况下,您可以使用反射,map函数args获取该方法的方法参数,然后调用该方法。
编辑:
似乎我误解了你的问题。您希望避免其他侦听器操作,例如kernel.view
,kernel.response
等。我认为您的解决方案没问题。但是,如果您在init
方法中设置会话变量,则不会像在kernel.response
事件期间调用的ContextListener那样保存它。