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

eme*_*his 4 model-view-controller cakephp cakephp-2.0

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

背景:我在CakePHP v2.3上.我正在调试一个导致意外重定向的问题,这是我找不到的.我试图通过逐步添加die()尝试识别重定向被触发的位置来处理请求的生命周期.

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

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

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

对其中任何一个的答案都很棒.

更新

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

Rea*_*lar 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"到您index.php的webroot.这将header can not be modified在发送重定向的位置强制发生错误.

  • 在`Controller :: redirect()`中放入`$ this-> log(Debugger :: trace());`然后检查日志. (2认同)

Gui*_*lla 9

好问题!取自本书:

典型要求

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