Phalcon 重定向和转发
Posted
技术标签:
【中文标题】Phalcon 重定向和转发【英文标题】:Phalcon redirection and forwarding 【发布时间】:2014-02-13 14:44:50 【问题描述】:我是否正确理解在执行$this->dispatcher->forward()
或$this->response->redirect()
之后我需要手动确保其余代码不会被执行?像下面这样,还是我错过了什么?
public function signinAction()
if ($this->isUserAuthenticated())
$this->response->redirect('/profile');
return;
// Stuff if he isn't authenticated…
【问题讨论】:
【参考方案1】:你需要像这样使用它:
return $this->response->redirect('/profile');
或
return $this->dispatcher->forward(array(
'action' => 'profile'
))
【讨论】:
如何在不使用 echo 的情况下从转发的控制器/动作中获取内容?【参考方案2】:在完成一个使用 Phalcon 超出其能力范围的核心项目将近一年之后,我想澄清一些事情并回答我自己的问题。要了解如何正确地进行重定向和转发,您需要了解一点 Dispatcher::dispatch 方法的工作原理。
看看代码here,虽然对我们大多数人来说都是 C 语言,但它的编写和文档都非常好。简而言之,这就是它的作用:
-
调度程序enters while 循环直到
_finished
属性变为true
或discovers 递归。
在循环内部,它立即将sets该属性设置为true
,因此当它开始下一次迭代时,它将自动break。
然后它会获取最初由路由器在应用程序中提供的控制器/操作信息,并进行各种检查。前后还完成了很多与活动相关的业务。
最后是calls 控制器中的操作方法和updates 带有(猜猜看!)返回值的_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;
【讨论】:
在response->redirect()
之后,一个简单的die()
不够吗? (我的意思不是禁用视图并返回)
在大多数情况下是的,在某些情况下不是,例如,当有一些逻辑要在其外部的操作之后运行时,并且大多数框架,包括 Phalcon,都具有该逻辑。在 Phalcon 的情况下,从here 开始,您可以看到最后一个操作之后发生的情况,但在大多数情况下,如果您在其上使用die
,这不会发挥任何作用。 die
是一种完成请求的笨方法,关于为什么使用它是一种不好的做法有一些意见,尤其是在处理该请求的框架中使用它时。【参考方案3】:
像这样使用 send()
public function signinAction()
if ($this->isUserAuthenticated())
return $this->response->redirect('profile')->send();
【讨论】:
这帮助我修复了它。我只使用了 response->redirect (预先使用 view->disable() ),但我的操作(应该受到登录保护)仍然被执行(即使显示了登录页面),添加了缺少的“发送()“让它工作。 谢谢!我已经分离了重定向功能,所以return
不起作用。您的解决方案帮助了我以上是关于Phalcon 重定向和转发的主要内容,如果未能解决你的问题,请参考以下文章