2013-12-11 37 views
4

擾流板:我想更好地理解對CakePHP應用程序的請求生命週期。CakePHP請求的生命週期是什麼?

背景:我在CakePHP v2.3上。我正在調試一個導致我無法找到的不需要的重定向的問題。我試圖通過遞增地添加die()來嘗試確定重定向的觸發位置,從而在整個請求的生命週期中順利完成工作。

我碰到了一個死衚衕,因爲我可以在控制器的beforeFilter()內終止執行,但是如果我將die()移動到實際操作中,重定向就會發生。

所以我的具體問題是:beforeFilter之後,但在行動之前會發生什麼?我知道beforeRender(),當我將die()放在那裏時,它沒有任何影響。

我的更一般/更好的問題是:是否有CakePHP請求的完整生命週期的文檔?

對這兩者中任何一個的答案都會很好。

更新

感謝馬修F.的有益的建議,我注重我的注意驗證組件上,因爲它幾乎是唯一的候選人,我調試看起來像它的手工重定向(中用戶到達authRedirect位置)。但是,當我在的AppController的頂部isAuthorized()沒有任何反應。而我的控制器沒有自己的isAuthorized()。所以這讓我再次陷入困境。

回答

8

因爲我可以從控制器的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。這將強制在發送重定向的地點出現header can not be modified錯誤。

+0

嗨,馬修!這真的很有幫助。我沒有意識到組件已經初始化。拋出'headers already'錯誤也是一個好主意。 – emersonthis

+0

呵呵。我在webroot/index.php中回顯「hello」,它阻止了重定向,但不會引發錯誤甚至通知。對此有何想法?我檢查了CakePHP日誌和開發服務器的php_error.log。 – emersonthis

+0

我添加了更多與調試Auth組件相關的調查問題。 – emersonthis

7

好問題! 從書摘自:

Typical request

  1. 裏卡多點擊指向http://www.example.com/cakes/buy的鏈接,然後他的瀏覽器向Web服務器的請求。
  2. 路由器解析URL以便提取此請求的參數:控制器,操作以及將在此請求期間影響業務邏輯的任何其他參數。
  3. 使用路由,請求URL被映射到控制器動作(特定控制器類中的方法)。在這種情況下,它是CakesController的buy()方法。在執行任何控制器操作邏輯之前調用控制器的beforeFilter()回調。
  4. 控制器可能使用模型來訪問應用程序的數據。在這個例子中,控制器使用一個模型從數據庫中提取裏卡多的最後一次購買。在此操作過程中可能會應用任何適用的模型回調,行爲和數據源。儘管不需要使用模型,但所有CakePHP控制器最初都需要至少一個模型。
  5. 模型檢索完數據後,它將返回給控制器。模型回調可能適用。
  6. 控制器可以使用組件來進一步細化數據或執行其他操作(會話操作,身份驗證或發送電子郵件等)。
  7. 一旦控制器已經使用模型和組件充分準備數據,那麼使用控制器的set()方法將數據交給視圖。控制器回調可能會在數據發送之前應用。執行視圖邏輯,其可以包括使用元素和/或助手。默認情況下,視圖呈現在佈局中。
  8. 可能會應用其他控制器回調(如afterFilter)。完整的渲染視圖代碼被髮送到裏卡多的瀏覽器。
+0

哇...很好地解釋與圖表。這非常有幫助。 – Tarunn

相關問題