php - 更正 ZF2 重定向行为

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

我已经使用 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/

相关文章:

php - 创建复杂的 IF、OR、NOT & AND SQL 查询 (MySQL)

jsf - 如何使用导航规则进行重定向

php - .htaccess 允许图像直接显示

apache - HTACCESS 通过 HTTPS 重定向添加 WWW

c# - 如何映射多对多关系?

php - 我可以在 SwiftMailer 中使用传统的电子邮件 "To"行吗?

php - 如何从表单中消除组合框

php - 从另一个集合中存在的集合中删除

php - Zend Acl - 模块、 Controller 、操作和模型

java - 将 List 添加到 session 并对其进行迭代