纠正ZF2重定向行为

时间:2014-01-23 23:55:20

标签: php redirect model-view-controller zend-framework2

我已经使用ZF2几个月了,我对控制器重定向应该如何工作感到困惑。是应该立即停止处理当前操作,并发送重定向请求?或者是否应该完成当前操作的处理,然后执行重定向?

非常基本的问题,是吗?

回到ZF1,我很确定重定向是立即发生的(与forward()不同,它存储起来直到当前操作完成)。我认为在ZF2中它是相同的情况,到目前为止,这是我的经验,但是今天突然我发现控制器正在存储重定向,并在当前操作结束时发送它。

以下是一个例子:

public function testAction()
{
    $this->redirect()->toUrl('/info');
    echo 'Hello';
    die();
}

在这种情况下,动作将回显'Hello'然后死亡。

我认为这可能是正常的事件过程而且我(仅仅是侥幸)在今天之前没有注意到它。我只是想确定,然后我回去改变我的所有控制器。 (另一种解释是,在我的配置中的某个地方,我正在销毁/覆盖重定向插件)。

1 个答案:

答案 0 :(得分:6)

在Zend Framework 2. *中,执行永不停止(除了特定的上传进度处理程序和控制台组件中的某些位置)。

因此,您必须停止控制器手动调度:

public function testAction()
{
    return $this->redirect()->toUrl('/info');

    echo 'Hello'; // will never be executed
}

更准确地说,从this callback开始(在触发Zend\Mvc\MvcEvent::EVENT_DISPATCH时使用),任何返回ResponseInterface的应用程序的dispatch事件的监听器都会导致应用finish事件的"short-circuit"

短路(在Zend\Mvc\Application中)基本上会导致后续事件被跳过并强制应用程序直接触发Zend\Mvc\MvcEvent::EVENT_FINISH事件,因此回显响应(发生在{{的监听器中) 1}}事件)。

在这个特定的控制器动作中,对finish助手的调用产生Zend\Http\Response,因为我们直接返回它,所以会触发短路。