【问题标题】: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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多