Spoiler:我想更好地了解对CakePHP应用程序的请求的生命周期。
背景:我在CakePHP v2.3上。我正在调试一个导致意外重定向的问题而我无法找到。我试图通过逐步添加die()
来尝试确定重定向被触发的位置,从而在请求的生命周期中工作。
我遇到了死胡同,因为我可以从控制器的beforeFilter()中杀死执行,但是如果我将die()
移动到实际操作中,则会发生重定向。
所以我的具体问题是:在beforeFilter之后但在行动之前会发生什么?我知道beforeRender(),当我放置die()
时没有效果。
我更普遍/更好的问题是:是否有关于CakePHP请求的完整生命周期的文档?
对这两种方法的回答都很棒。
更新
感谢Mathew F。提供了有用的建议,我将注意力集中在Auth组件上,因为它几乎是唯一的候选人,我调试的重定向看起来就像是&# #39; s handiwork(用户到达authRedirect位置)。但是,当我转到AppController顶部的die()
isAuthorized()
时,没有任何反应。我的控制器没有自己的isAuthorized()
。所以这让我有点难过了。
答案 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)
好问题! 取自本书: