我已经使用ZF2几个月了,我对控制器重定向应该如何工作感到困惑。是应该立即停止处理当前操作,并发送重定向请求?或者是否应该完成当前操作的处理,然后执行重定向?
非常基本的问题,是吗?
回到ZF1,我很确定重定向是立即发生的(与forward()
不同,它存储起来直到当前操作完成)。我认为在ZF2中它是相同的情况,到目前为止,这是我的经验,但是今天突然我发现控制器正在存储重定向,并在当前操作结束时发送它。
以下是一个例子:
public function testAction()
{
$this->redirect()->toUrl('/info');
echo 'Hello';
die();
}
在这种情况下,动作将回显'Hello'然后死亡。
我认为这可能是正常的事件过程而且我(仅仅是侥幸)在今天之前没有注意到它。我只是想确定,然后我回去改变我的所有控制器。 (另一种解释是,在我的配置中的某个地方,我正在销毁/覆盖重定向插件)。
答案 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
,因为我们直接返回它,所以会触发短路。