Php Symfony 2具有发送响应能力的控制器的默认操作

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

我侦听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操作能够返回应该发送的响应,而不是调用的操作之一。在此之后,不应执行任何其他操作


我的问题是,我这样做是对的吗?因为a不想“对抗框架”,通过调用exit来结束执行似乎是不对的。

您可以将控制器的
init
方法设置为当前可调用的方法,例如

$initController = array($currentController, 'init');
$event->setController($initController);
然后Symfony将处理
init
方法而不是默认的控制器方法,并返回响应(如果存在)。如果
init
方法返回
null
,我假设您希望调用默认的控制器方法。在这种情况下,可以使用反射、映射函数args获取该方法的方法参数,然后调用该方法

编辑:


看来我误解了你的问题。您希望避免其他侦听器操作,如
kernel.view
kernel.response
等。我认为您的解决方案还可以。但是,如果在
init
方法中设置会话变量,它将不会保存为在
kernel.response
事件期间调用的会话变量。

我没有尝试过您的特定情况,但我认为$event->stopPropagation();返回;应该在您的出口()处工作;查看此链接的底部:在事件中,您可以使用该方法立即返回响应。