我是否理解正确执行$this->dispatcher->forward()
或$this->response->redirect()
之后我需要手动确保其余代码不会被执行?如下,或者我错过了什么?
public function signinAction()
{
if ($this->isUserAuthenticated())
{
$this->response->redirect('/profile');
return;
}
// Stuff if he isn't authenticated…
}
答案 0 :(得分:27)
在使用Phalcon超出其能力的核心项目工作近一年后,我想澄清一些事情并回答我自己的问题。要了解如何正确执行重定向和转发,您需要了解Dispatcher::dispatch方法的工作原理。
看一下代码here,虽然它对我们大多数人来说都是C mumbo-jumbo,但它写得非常好并且有文档证明。简而言之,这就是它的作用:
_finished
属性变为true
或discovers递归。true
,因此当它开始下一次迭代时,它将自动break。_returnedValue
属性(猜测是什么!)返回的值。Dispatcher::forward
方法,它会update _finished
属性返回false
,这将允许while循环从步骤继续这个清单中有2个。因此,在您重定向或转发之后,您需要确保代码不会被执行 ,如果这是预期逻辑的一部分。换句话说,您不必返回return $this->response->redirect
或return $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();
}
}