【问题标题】:Symfony 2 default action for controller with ability to send response具有发送响应能力的控制器的 Symfony 2 默认操作
【发布时间】:2012-04-12 07:53:40
【问题描述】:

我听 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 来结束执行似乎并不正确。

【问题讨论】:

标签: php model-view-controller symfony controller


【解决方案1】:

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

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

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

编辑:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多