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

我的问题是,我这样做的方式是否正确?因为不想“与框架作斗争”并通过调用 exit 来结束执行似乎并不正确。

4

1 回答 1

1

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

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

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

编辑:

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

于 2012-04-17T07:36:56.833 回答