【问题标题】:What is the lifecycle of a CakePHP request?CakePHP 请求的生命周期是什么?
【发布时间】:2013-12-12 10:57:20
【问题描述】:

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

背景:我使用的是 CakePHP v2.3。我正在调试一个导致我找不到的不需要的重定向的问题。我正在尝试通过逐步添加die() 来尝试确定触发重定向的位置来完成请求的生命周期。

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

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

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

这两个问题的答案都很好。

更新

感谢 Mathew F. 的有用建议,我将注意力集中在 Auth 组件上,因为它几乎是唯一的候选者,而且我正在调试的重定向看起来像是手工制作的(用户到达 authRedirect 位置)。但是,当我尝试在 AppController 的 isAuthorized() 顶部使用 die() 时,什么也没有发生。我的控制器没有自己的isAuthorized()。所以这又让我有点难过。

【问题讨论】:

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


    【解决方案1】:

    我遇到了死胡同,因为我可以从控制器的 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 错误。

    【讨论】:

    • 你好,马修!这真的很有帮助。那时我没有意识到组件已初始化。抛出headers already sent 错误也是一个好主意。
    • 嗯。我在 webroot/index.php 中回显了“hello”,它可以防止重定向,但不会引发错误甚至通知。对此有什么想法吗?我检查了 CakePHP 日志和开发服务器的 php_error.log。
    • 我对问题添加了更新,其中包含与调试我的 Auth 组件相关的更多发现。
    • PHP 错误已关闭。您可以尝试在core.php 中设置Configure::write('debug',2),并检查php.ini 是否设置了error_reporting=E_ALLdisplay_errors=1。完成后关闭(如果是生产服务器)。
    • $this->log(Debugger::trace()); 放入Controller::redirect(),然后查看日志。
    【解决方案2】:

    好问题! 摘自书中:

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

    【讨论】:

    • 哇...用图表很好地解释了。很有帮助。
    猜你喜欢
    • 2011-04-27
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多