Phalcon重定向和转发

时间:2014-01-23 07:09:59

标签: phalcon

我是否理解正确执行$this->dispatcher->forward()$this->response->redirect()之后我需要手动确保其余代码不会被执行?如下,或者我错过了什么?

public function signinAction()
{
    if ($this->isUserAuthenticated())
    {
        $this->response->redirect('/profile');
        return;
    }

    // Stuff if he isn't authenticated…
}

3 个答案:

答案 0 :(得分:27)

在使用Phalcon超出其能力的核心项目工作近一年后,我想澄清一些事情并回答我自己的问题。要了解如何正确执行重定向和转发,您需要了解Dispatcher::dispatch方法的工作原理。

看一下代码here,虽然它对我们大多数人来说都是C mumbo-jumbo,但它写得非常好并且有文档证明。简而言之,这就是它的作用:

  1. 调度程序enters while循环,直到_finished属性变为truediscovers递归。
  2. 在循环内部,它会立即sets该属性为true,因此当它开始下一次迭代时,它将自动break
  3. 然后获取控制器/操作信息,这些信息最初由应用程序中的路由器提供,并进行各种检查。在此之前和之后,它还完成了许多与事件相关的业务。
  4. 最后calls控制器中的操作方法updates _returnedValue属性(猜测是什么!)返回的值。
  5. 如果在通话操作期间您调用了Dispatcher::forward方法,它会update _finished属性返回false,这将允许while循环从步骤继续这个清单中有2个。
  6. 因此,在您重定向或转发之后,您需要确保代码不会被执行 ,如果这是预期逻辑的一部分。换句话说,您不必返回return $this->response->redirectreturn $this->dispatcher->forward的结果。

    做最后一次看起来很方便,但不是很正确,可能会导致问题。在99.9%的情况下,你的控制器不应该返回任何东西。例外情况是当您实际知道自己在做什么并希望通过返回响应对象来change应用程序中呈现过程的行为时。最重要的是,您的IDE可能会抱怨返回语句不一致。

    最终确定,从控制器内重定向的正确方法:

    // Calling redirect only sets the 30X response status. You also should
    // disable the view to prevent the unnecessary rendering.
    
    $this->response->redirect('/profile');
    $this->view->disable();
    
    // If you are in the middle of something, you probably don't want 
    // the rest of the code running.
    
    return; 
    

    前进:

    $this->dispatcher->forward(['action' => 'profile']);
    
    // Again, exit if you don't need the rest of the logic.
    
    return;
    

答案 1 :(得分:10)

您需要像这样使用它:

return $this->response->redirect('/profile');

return $this->dispatcher->forward(array(
    'action' => 'profile'
))

答案 2 :(得分:2)

像这样使用send()

public function signinAction()
{
    if ($this->isUserAuthenticated())
    {
        return $this->response->redirect('profile')->send();
    }
}