2008年3月25日 星期二

CakePHP處理HTTP Request 典型的流程

圖片來源:A Typical CakePHP Request

參考資料: A Typical CakePHP Request

上圖其實也說明了MVC的架構概念以及處理流程!

1. 使用者瀏覽網站(例加:瀏覽 /cake/buy,cake是controller, buy是action,也就是呼叫cake_controller.php 中的 buy函式),這時 your_cakephp1.2/app/webroot/index.php 會收到經由 mod_rewrite 轉換的網址(mod_rewrite會將 /cake/buy 轉成 index.php?url=/cake/buy),在index.php中,使用Dispatcher(your_cakephp1.2/cake/dispatcher.php),把網址傳給Dispatcher。以下是index.php的部分程式碼:

$Dispatcher = new Dispatcher();
$Dispatcher->dispatch($url);

2. Dispatcher中,透過Router (your_cakephp1.2/cake/libs/router.php),取得Controller和Action的名稱。

3. 在開始使用Controller的Action之前,先呼叫這個controller的beforeFilter(也就是圖上 Controller的藍色框所表示的意思)。

4.5.6. 經過 controller 的 beforeFilter 之後,開始呼叫 Action 函式,一般在Action 函式中,會使用者Models來處理資料庫相關的工作,用Components處理像Cookie, Session的相關工作,視你的程式而定,最後將資料透過 set() 的方式,傳給 View 處理。

7. 在View處理版型前,會呼叫 controller 的 beforeRender (也就是 7 箭頭上的藍框)。一般網頁的版型,會有layout、element和自身action的view版型組成,其中會使用helper來協助處理版型。

8. 在處理完版型,回覆給使用者前,Dispatcher會再呼叫 controller 的 afterFilter (也就是 8 箭頭上的藍框。註)

以上就是很典型CakePHP處理Request的流程。

註:

CakePHP官網上說明 Controller 有四個callback函式:beforeFilter, beforeRender, afterRender, afterFilter。不過我在 cake/libs/controller/controller.php 找不到afterRender的定義,也找不到afterRender使用的地方,不知道是我還沒讀透程式碼,還是官方誤植了這個函式。因此上圖的8 箭頭的另一個藍框,應該是指afterRender。

張貼留言