Php Zend 2-重定向Exaplanaion

Php Zend 2-重定向Exaplanaion,php,redirect,routes,zend-framework2,Php,Redirect,Routes,Zend Framework2,我很难准确理解重定向行为 实际上,我有一个控制器,可以调用一些拦截器类 ... $i->intercept(); ... 这些类执行一些工作,并可能决定将请求重定向到另一个控制器\操作 ... $redirector->toRoute($route, array( 'action' => $action, )); 但这一行似乎什么都不做,其实在页面上显示的内容本来就是所谓的动作。调用1原始操作和2重定向后的操作,我想要的

我很难准确理解重定向行为

实际上,我有一个控制器,可以调用一些拦截器类

...
$i->intercept();
...
这些类执行一些工作,并可能决定将请求重定向到另一个控制器\操作

...
$redirector->toRoute($route, array(
            'action'        => $action,
        ));
但这一行似乎什么都不做,其实在页面上显示的内容本来就是所谓的动作。调用1原始操作和2重定向后的操作,我想要的是执行操作2并呈现相关视图,而不是执行操作1的代码

我做错了什么


非常感谢

应用程序中通常的流程是引导>路由>调度(控制器运行)>渲染。如果要执行重定向,则在控制器级别(调度)执行重定向。因此,您希望停止正常流,而不希望进入渲染阶段

在Zend框架中,您可以通过返回响应对象来停止此循环。如果在路由或分派期间在任何位置返回响应,则流将停止,并且该响应对象将返回到浏览器。您必须了解重定向插件实际上创建了一个响应对象:

public function fooAction()
{
    // Do some work in this controller action

    return $this->redirector()->toRoute('bar');
}
重定向器方法
toRoute()
返回响应,并在控制器中返回该响应对象。因此,应用程序停止了通常的流程,并将响应发送到浏览器

您必须捕获拦截器类的结果,检查它是否是响应,如果是,则返回它。当然,您必须在类中返回重定向的结果

因此,第1步,在拦截器类中返回响应:

return $redirector->toRoute(/* ... */);
use Zend\Http\Response;

$result = $i->intercept();
if ($result instanceof Response) {
    return $result;
}
第2步,检查拦截器类的返回值:

return $redirector->toRoute(/* ... */);
use Zend\Http\Response;

$result = $i->intercept();
if ($result instanceof Response) {
    return $result;
}