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

时间:2012-04-12 07:53:41

标签: php model-view-controller symfony controller

我听了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来结束执行似乎不对。

1 个答案:

答案 0 :(得分:1)

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

$initController = array($currentController, 'init');
$event->setController($initController);

然后Symfony将处理默认控制器方法的init方法并返回响应(如果存在)。我假设您要在init方法返回null时调用默认控制器方法。在这种情况下,您可以使用反射,map函数args获取该方法的方法参数,然后调用该方法。

编辑:

似乎我误解了你的问题。您希望避免其他侦听器操作,例如kernel.viewkernel.response等。我认为您的解决方案没问题。但是,如果您在init方法中设置会话变量,则不会像在kernel.response事件期间调用的ContextListener那样保存它。