CakePHP请求的生命周期是什么?
Spoiler:我想更好地了解CakePHP应用程序请求的生命周期 背景:我正在使用CakePHP v2.3。我正在调试一个问题,该问题导致我找不到不需要的重定向。我正试图通过递增地添加CakePHP请求的生命周期是什么?,cakephp,model-view-controller,cakephp-2.0,Cakephp,Model View Controller,Cakephp 2.0,Spoiler:我想更好地了解CakePHP应用程序请求的生命周期 背景:我正在使用CakePHP v2.3。我正在调试一个问题,该问题导致我找不到不需要的重定向。我正试图通过递增地添加die()来确定重定向触发的位置,从而在请求的整个生命周期中发挥作用 我遇到了死胡同,因为我可以从控制器的beforeFilter()中终止执行,但是如果我将die()移动到实际操作中,就会发生重定向 因此,我的具体问题是:在beforeFilter之后但在操作之前会发生什么?我知道beforeRender(),
die()
来确定重定向触发的位置,从而在请求的整个生命周期中发挥作用
我遇到了死胡同,因为我可以从控制器的beforeFilter()中终止执行,但是如果我将die()
移动到实际操作中,就会发生重定向
因此,我的具体问题是:在beforeFilter之后但在操作之前会发生什么?我知道beforeRender(),当我将die()
放在那里时,它没有任何效果
我更一般/更好的问题是:是否有关于CakePHP请求整个生命周期的文档
这两个问题的答案都很好
更新
感谢Mathew F.的有益建议,我将注意力集中在Auth组件上,因为它几乎是唯一的候选组件,我正在调试的重定向看起来像是手工操作(用户到达authRedirect位置)。但是,当我尝试在AppController的isAuthorized()顶部执行die()
操作时,什么也没有发生。我的控制器本身没有isAuthorized()
。所以这又让我有点困惑了
我遇到了死胡同,因为我可以从控制器的beforeFilter()中终止执行,但是如果我将die()移动到实际操作中,就会发生重定向
这是重定向是由组件执行的一个重要线索
在为请求配置任何内容之前调用beforeFilter()
。这包括控制器及其组件。在调用控制器的操作之前初始化组件。因此,组件可以重定向(即AuthComponent可以重定向)
因此,我的具体问题是:在beforeFilter之后但在操作之前会发生什么?我知道beforeRender(),当我在那里放置die()时,它没有任何效果
该请求首先由调度器处理。它被路由到控制器的操作。然后实例化该控制器,并实例化其所有组件。对于每个组件,将调用它们的initialize()
方法。然后调用控制器的beforeFilter()
方法。然后是所有组件startup()
方法。然后调用控制器的操作
您可以尝试排除组件以查找导致故障的组件。另一个选项是将echo“hello”
添加到webroot中的index.php
。这将强制在发送重定向时出现无法修改标题的错误。问得好!
摘自该书:
Ricardo单击指向的链接,他的浏览器向您的web服务器发出请求
路由器解析URL以提取此请求的参数:控制器、操作和在该请求期间影响业务逻辑的任何其他参数
使用路由,将请求URL映射到控制器操作(特定控制器类中的方法)。在本例中,它是CakesController的buy()方法。在执行任何控制器操作逻辑之前,将调用控制器的beforeFilter()回调
控制器可以使用模型来访问应用程序的数据。在本例中,控制器使用模型从数据库中获取Ricardo最后购买的物品。在此操作期间,可能会应用任何适用的模型回调、行为和数据源。虽然不需要使用模型,但所有CakePHP控制器最初至少需要一个模型
模型检索到数据后,将其返回给控制器。模型回调可能适用
控制器可使用组件进一步细化数据或执行其他操作(例如,会话操纵、认证或发送电子邮件)
控制器使用模型和组件充分准备数据后,将使用控制器的set()方法将数据传递给视图。可以在发送数据之前应用控制器回调。执行视图逻辑,其中可能包括使用元素和/或辅助对象。默认情况下,视图在布局内部渲染
可以应用其他控制器回调(如afterFilter)。完整的渲染视图代码将发送到Ricardo的浏览器
你好,马修!这真的很有帮助。我当时没有意识到组件已经初始化了。抛出已经发送的头
错误也是一个好主意。我在webroot/index.php中回显了“hello”,它阻止了重定向,但不会抛出错误甚至通知。有什么想法吗?我检查了CakePHP日志和开发服务器的php_error.log。我在问题中添加了一个更新,其中包含与调试Auth组件相关的更多发现。php错误已关闭。您可以尝试在core.php
中设置Configure::write('debug',2)
,并检查php.ini是否设置了error\u reporting=E\u ALL
和display\u errors=1
。完成后关闭(如果是生产服务器)。放入$this->log(Debugger::trace())代码>在控制器::重定向()
中,然后检查日志。哇。。。用图表解释得很好。这很有帮助。