2008年3月26日 星期三

CakePHP 1.2 Controller 簡介

依據MVC的概念,Controller通常都是負責網站規則、流程的控管,CakePHP也不例外。在程式的安排上,CakePHP建議一個Controller負責一個Model相關的網站規則與流程,簡單來說,在寫Controller時,如果沒特別的需求,一個Controller最好只使用一個Model;一來網站的程式好管理,二來Controller的程式在執行過程也減少記憶體的浪費。因此在寫網站時,可以依據這個法測,來安排規劃程式。Controller的method通常稱作Action,而每個Action,如果沒有特殊需求,通常會有專屬的View。Controller通常是繼承CakePHP的AppController (your_cake1.2/cake/libs/controller/app_controller.php),從source code來看,其實Controller也可以直接繼承 Controller(your_cake1.2/cake/libs/controller/controller.php),視需要而定。

Controller 屬性:
$name: 顧名思義,也就是Controller的名稱,但要注意的是,不是Controller的ClassName。例如:PostController (檔名:post_controller.php),那它的 $name 應該是 Post 而不是 PostController;而且$name這個變數,在CakePHP的設計中,如果Controller程式沒有修改使用那些Model的話,它預設會去找相同名稱的Model,也就是Post這個Model。

$uses: 設定使用那些Model,如果都沒使用Model時,可以設定成 null,如果在程式中,沒有修改這個值的話,則CakePHP會去尋找和Controller相同名稱的Model。要使用model時,以array的方式來設定。Ex: public $uses = array('Post');

$components: 在CakePHP的設計中,components是指協助Controller處理網站規則與流程。如網站常用會用到的Session, Cookie等,CakePHP本身也內建了相對應的component來協助處理。如果要使用component的話,以array的方式來設定即可。Ex: public $uses = array('Session', 'Cookie');

$helpers: 在CakePHP的設計中,components是指協助處理版型的,也就是View。如果沒有設定時,Controller會預設使用 Html 及 Form 這兩個Helper。同理,如果要使用其他的Helper時,以array的方式設定。Ex: public $helpers = array('Form', 'Ajax');

$layout: 指定Controller要使用那個外框的版型,預設是 default.ctp (your_cake1.2/app/views/layouts/defautl.ctp or your_cake1.2/cake/libs/view/layouts/default.ctp)。可以在Controller或者Action中,重新設定這個值,來使用不同的外框版型。Ex: $this->layout='ajax'; /* 會使用 layouts/ajax.ctp */

$pageTitle: 設定版型中 HTML的Title。使用的前題是,在外框的版型上,要保留 <?php echo $title_for_layout; ?> (請參考 CakePHP 1.2 第一個程式,換掉CakePHP說明首頁 )。

參數屬性:
$this->data: 在CakePHP的設計上,如果你的版型上,是寫
<input name="data[User][first_name]" value="" type="text" /> 且用POST傳給Controller時,那麼在Controller的Action中,就可以使用 $this->data['User']['first_name'] 來讀取這個值。(註:只有 POST 才行)。

Controller常用的函式:

set(string $var, mixed $value): 這個函式最常用,主要是要把資料,傳給View使用。

redirect(string $url, integer $status, boolean $exit): 轉址,類似 header('Location: /help.html'); 功能。

flash(string $message, string $url, integer $pause): 跳轉畫面。會先出現一段訊息後,再自動跳轉到指定的網址。

Callbacks:
beforeFilter(): 在呼叫任何Action之前,會先執行這個函式。

beforeRender(): 在產生View的結果前,會先執行這個函式。

afterFilter(): 在呼叫任何Action之後,會再執行這個函式。

afterRender(): 在產生View的結果之後,會再執行這個函式。

詳細的執行順序,請見 CakePHP處理HTTP Request 典型的流程

其他常用的函式:
loadModel('ModelName'): 自行載入要使用的Model。

disableCache(): 告知瀏覽器不要cache 網頁。

paginate(): 分頁的功能,請見 CakePHP Pagination (分頁功能) , CakePHP Pagination (分頁功能) 加入自己的參數

requestAction(string $url, array $options): 顧名思意,就是呼叫其他Controller的Action。如果需要被呼叫的Action的版型,請在options加'return'Ex: echo $this->requestAction('/post/all', array('return')); 如此就可以在網頁上顯示這個Action的結果。同理,不需要版型的話,就不要傳入'return'。這個函式可以應用的地方很多,也可以在View裏面使用(例如在某個action的.ctp用使用),簡單來說,可以視作一種呼叫函式的方法。

參考資料:http://book.cakephp.org/view/49/controllers



張貼留言