CakePHP请求的生命周期是什么?

时间:2013-12-11 17:26:43

标签: cakephp model-view-controller cakephp-2.0

Spoiler:我想更好地了解对CakePHP应用程序的请求的生命周期。

背景:我在CakePHP v2.3上。我正在调试一个导致意外重定向的问题而我无法找到。我试图通过逐步添加die()来尝试确定重定向被触发的位置,从而在请求的生命周期中工作。

我遇到了死胡同,因为我可以从控制器的beforeFilter()中杀死执行,但是如果我将die()移动到实际操作中,则会发生重定向。

所以我的具体问题是:在beforeFilter之后但在行动之前会发生什么?我知道beforeRender(),当我放置die()时没有效果。

我更普遍/更好的问题是:是否有关于CakePHP请求的完整生命周期的文档?

对这两种方法的回答都很棒。

更新

感谢Mathew F。提供了有用的建议,我将注意力集中在Auth组件上,因为它几乎是唯一的候选人,我调试的重定向看起来就像是&# #39; s handiwork(用户到达authRedirect位置)。但是,当我转到AppController顶部的die() isAuthorized()时,没有任何反应。我的控制器没有自己的isAuthorized()。所以这让我有点难过了。

2 个答案:

答案 0 :(得分:9)

  

我遇到了死胡同,因为我可以从控制器的beforeFilter()中杀死执行,但是如果我将die()移动到实际操作中,则会发生重定向。

这是一个很大的线索,重定向是由一个组件执行的。

在为请求配置任何内容之前调用

beforeFilter()。这包括控制器及其组件。在调用控制器的操作之前初始化组件。因此组件可以重定向(即AuthComponent执行此操作)。

  

所以我的具体问题是:在beforeFilter之后但在行动之前会发生什么?我知道beforeRender(),当我把die()放在那里时没有效果。

请求首先由调度员处理。它被路由到控制器的动作。然后实例化该控制器,然后实例化其所有组件。对于每个组件,调用它们的initialize()方法。之后调用控制器的beforeFilter()方法。其次是所有组件startup()方法。然后调用控制器的动作。

http://book.cakephp.org/2.0/en/controllers/components.html#component-api

您可以尝试排除组件以找到导致问题的组件。另一种方法是将echo "hello"添加到webroot中的index.php。这将强制在发送重定向的位置发生header can not be modified错误。

答案 1 :(得分:9)

好问题! 取自本书:

Typical request

  1. Ricardo点击指向http://www.example.com/cakes/buy的链接,他的浏览器向您的网络服务器发出请求。
  2. 路由器解析URL以提取此请求的参数:控制器,操作以及在此请求期间将影响业务逻辑的任何其他参数。
  3. 使用路由,请求URL映射到控制器操作(特定控制器类中的方法)。在这种情况下,它是CakesController的buy()方法。在执行任何控制器操作逻辑之前调用控制器的beforeFilter()回调。
  4. 控制器可以使用模型来访问应用程序的数据。在此示例中,控制器使用模型从数据库中获取Ricardo的上次购买。在此操作期间,可能会应用任何适用的模型回调,行为和数据源。虽然不需要使用模型,但所有CakePHP控制器最初都需要至少一个模型。
  5. 模型检索到数据后,将其返回给控制器。模型回调可能适用。
  6. 控制器可以使用组件进一步细化数据或执行其他操作(例如,会话操作,身份验证或发送电子邮件)。
  7. 一旦控制器使用模型和组件充分准备数据,就会使用控制器的set()方法将数据传递给视图。可以在发送数据之前应用控制器回调。执行视图逻辑,其可以包括元素和/或帮助器的使用。默认情况下,视图在布局内呈现。
  8. 可以应用其他控制器回调(如afterFilter)。完整的渲染视图代码将发送到里卡多的浏览器。