我已经使用 ZF2 几个月了,我对 Controller 重定向应该如何工作感到困惑。是否应该立即停止处理当前操作,并发送重定向请求?还是应该完成当前操作的处理,然后执行重定向?
很基础的问题,是吧?
回到 ZF1,我很确定重定向是立即发生的(与 forward()
不同,它会一直存储到当前操作完成)。我假设 ZF2 中的情况相同,到目前为止这是我的经验,但是今天我突然发现 Controller 正在存储重定向,并在当前操作结束时发送它。
这是一个例子:
public function testAction()
{
$this->redirect()->toUrl('/info');
echo 'Hello';
die();
}
在这种情况下,action 将回显“Hello”然后结束。
我认为这可能是事件的正常过程,我只是(纯属侥幸)在今天之前没有注意到它。不过,在我回去更改所有 Controller 之前,我只是想确定一下。 (另一种解释是,在我的配置中的某个地方,我正在破坏/覆盖重定向插件)。
最佳答案
在 Zend Framework 2.* 中,执行永远不会停止(特定的上传进度处理程序和控制台组件中的某些位置除外)。
因此,您必须停止 Controller 手动调度:
public function testAction()
{
return $this->redirect()->toUrl('/info');
echo 'Hello'; // will never be executed
}
更准确地说,截至 this callback (在触发 Zend\Mvc\MvcEvent::EVENT_DISPATCH
时使用),任何对返回 ResponseInterface
的应用程序的 dispatch
事件的监听器导致 "short-circuit"到应用程序 finish
事件。
短路(在 Zend\Mvc\Application
中)基本上会导致后续事件被跳过并强制应用程序直接触发 Zend\Mvc\MvcEvent::EVENT_FINISH
事件,因此回显响应(发生在 finish
事件的监听器中)。
在这个特定的 Controller 操作中,对 $this->redirect()->toUrl('...')
助手的调用产生一个 Zend\Http\Response
,因为我们直接返回它,所以触发了短路。
关于php - 更正 ZF2 重定向行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21321808/