纠正ZF2重定向行为

Kim*_*nce 3 php model-view-controller redirect zend-framework2

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

非常基本的问题,是吧?

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

这是一个例子:

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

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

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

Ocr*_*ius 6

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

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

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

    echo 'Hello'; // will never be executed
}
Run Code Online (Sandbox Code Playgroud)

更准确地说,从此回调(在触发a时使用Zend\Mvc\MvcEvent::EVENT_DISPATCH),任何dispatch返回a的应用程序事件的监听器ResponseInterface都会导致应用程序事件"短路"finish.

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

在这个特定的控制器动作中,对$this->redirect()->toUrl('...')辅助器的调用产生一个Zend\Http\Response,并且由于我们直接返回它,因此触发了短路.