2014-01-23 25 views
3

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

很基本的问题,呵呵?

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

下面是一个例子:

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

在这种情况下,该操作将呼应“你好”,然后死去。

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

回答

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),向dispatch事件返回的应用程序的任何听者一个ResponseInterface导致"short-circuit"到应用程序finish事件。

的短路(在Zend\Mvc\Application)基本上导致要跳过后续事件和强制应用到直接触发事件因此呼应响应(发生在finish事件的监听器)。

在这个特定的控制器操作中,对$this->redirect()->toUrl('...')帮助程序的调用会产生一个Zend\Http\Response,并且由于我们直接将其返回,所以会触发短路。

+0

谢谢奥克拉米斯,一个很好的教程! –