【问题标题】:Zend 2 - Redirect exaplainaionZend 2 - 重定向解释
【发布时间】:2013-11-29 09:11:33
【问题描述】:
我有些难以准确理解重定向行为。
实际上我有一个调用一些拦截器类的控制器
...
$i->intercept();
...
这些类做了一些工作,并可能决定将请求重定向到另一个 Controller\Action。
...
$redirector->toRoute($route, array(
'action' => $action,
));
但是这行好像什么都没做,其实在页面中就是展示了原本调用action的内容。调用 1 原始动作和 2 重定向后的动作,我想要的是执行动作 2 并渲染相关视图而不执行动作 1 的代码。
我做错了什么?
非常感谢
【问题讨论】:
标签:
php
redirect
routes
zend-framework2
【解决方案1】:
应用程序中通常的流程是引导 > 路由 > 调度(控制器运行)> 渲染。如果您想执行重定向,则在您的情况下发生在控制器级别(调度)。所以,你想停止正常的流程,不想进入渲染阶段。
在 Zend Framework 中,您可以通过返回一个 Response 对象来停止此循环。如果您在路由或调度期间的任何地方返回响应,则流程将停止并且该响应对象将返回给浏览器。您必须了解重定向插件实际上创建了一个 Response 对象:
public function fooAction()
{
// Do some work in this controller action
return $this->redirector()->toRoute('bar');
}
重定向器方法toRoute() 返回一个响应,并在控制器中返回此响应对象。因此,应用程序会停止通常的流程并将响应发送到浏览器。
您必须捕获拦截器类的结果,检查它是否是响应,如果是,则返回它。当然你必须在你的类中返回重定向的结果。
所以第 1 步,在你的拦截器类中返回响应:
return $redirector->toRoute(/* ... */);
第 2 步,检查拦截器类的返回值:
use Zend\Http\Response;
$result = $i->intercept();
if ($result instanceof Response) {
return $result;
}