Php Symfony 2具有发送响应能力的控制器的默认操作
我侦听kernel.controller操作以实现控制器的默认(或初始化)操作:Php Symfony 2具有发送响应能力的控制器的默认操作,php,model-view-controller,symfony,controller,Php,Model View Controller,Symfony,Controller,我侦听kernel.controller操作以实现控制器的默认(或初始化)操作: public function onKernelController(FilterControllerEvent $event) { $controller = $event->getController(); if (!is_array($controller)) { return; } $currentController = $controller[0
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操作能够返回应该发送的响应,而不是调用的操作之一。在此之后,不应执行任何其他操作
我的问题是,我这样做是对的吗?因为a不想“对抗框架”,通过调用exit来结束执行似乎是不对的。您可以将控制器的
init
方法设置为当前可调用的方法,例如
$initController = array($currentController, 'init');
$event->setController($initController);
然后Symfony将处理init
方法而不是默认的控制器方法,并返回响应(如果存在)。如果init
方法返回null
,我假设您希望调用默认的控制器方法。在这种情况下,可以使用反射、映射函数args获取该方法的方法参数,然后调用该方法
编辑:
看来我误解了你的问题。您希望避免其他侦听器操作,如
kernel.view
、kernel.response
等。我认为您的解决方案还可以。但是,如果在init
方法中设置会话变量,它将不会保存为在kernel.response
事件期间调用的会话变量。我没有尝试过您的特定情况,但我认为$event->stopPropagation();返回;应该在您的出口()处工作;查看此链接的底部:在事件中,您可以使用该方法立即返回响应。