RSS

2011/03/31

快速開發 PHP web app - CakePHP

製作 web app, 一般來說主要都是分兩個部份. 先是設定好 database 儲存資料, 然後就是製作介面, 令用家可以透過介面處理資料.

這類介面一般提供資料儲存的四個主要工作功能: 建立, 查閱, 更新 以及 刪除, 亦即是所謂的 CRUD (create, read update delete).

要是為每一個 web app 都重新寫一遍以上的功能, 會是一個又花時間又重覆的工序. 若果懂得利用 open source framwork 的話, 則事半功倍.

CakePHP 所提供的, 是 MVC 加上 ORM 的模型. 其概念是從 Ruby on Rails 而來的.

使用 CakePHP 的方法, 首先是在 Model 設定每一個 database table, 特別是 table 與 table 之間的關聯. 然後在相應的 Controller 中, 為每一個 View, 寫一個 function. 這個 function 的角色, 主要是從 Model 抓來需要的資料, 然後送到特定的 View 作顯示.

舉個例, 如果我要為一個叫 users 的 table 作一個叫 view 的頁面, 我需要做三件事:

第一, 建立檔案 app/models/user.php


<?php

class User extends AppModel {
var $name = 'User';
}

?>


這就表示我有一個叫 User 的 model, 而 CakePHP 就會自動把這個 model 對應 database 上的 users table. Model 及 database table 之間的對應是自動的, 但是亦可以自行設定.

第二, 建立檔案 app/controllers/users_controller.php


<?php

class UsersController extends AppController {
function view($id) {
$this->User->id = $id;
$data = $this->User->read();
$this->set('data', $data);
}
}

?>


這就表示, view 這個 View 需要一個 parameter ($id), 然後我要從 User Model 讀取 id 是 $id 的資料, 送到 View 的 $data. View 跟 URL 是相對的, CakePHP 會自動把 URL 的要求送到 Controller 中對應的 function.
上面這個 function 對應的 URL 就是 http://<some domain>/<app folder>/users/view/<id>

最後就是建立檔案 app/views/users/view.ctp , 這個檔案就是一個 template (所以是 .ctp 不是 .php), 舉例說可以很簡單的把資料顯示出來:


<?php

foreach($data['User'] as $key => $value) {
echo "

$key = $value

";
}

?>


要留意的是, 這裡只包括內容的部份, 每個 View 都需要配上一個 layout 才完整, 不指定的話就是很普通的 HTML layout, 實際使用時當然要自行 customize.

使用 layout 的好處, 就是可以因應不同情況選擇不同的 layout, 例如是對應 web 及 mobile platform 使用不同的 layout, 或者是因為用戶選擇而導出 PDF 版本或 RSS 版本等等.

CakePHP 的功能有很多, 以上只是皮毛的概念, 當中還有很多其他東西需要留意的. 例如是設定檔, 以及更進一步 modulize MVC 三方功能的 Behaviors(Model 用), Components(Controller 用) 以及 Helpers/Elements(View 用). 有興趣的不妨看看 CakePHP 提供的 cookbook (因為是cake, 所以就是 cookbook 囉).

若果要求是很簡單的 CRUD 的話, 更可以考慮使用他們的 bake 功能. 這就像焗蛋糕一樣, 只需要準備好材料(database table 及其之間的關聯), 再進行一點步驟(在 console 執行 bake 指令), 就能夠自動產生相應的 CRUD 介面. 不過, 自動產生的介面限制不少, 我還是比較建議自行從 MVC 三方落手.

雖然說利用這類 framwork 工作會很方便, 不過也請盡量正確地使用它. 舉例說, 使用 MVC 模型時, 很容易就不自覺地把 business logic 跟 application logic 混合在一起, 令到 controller 異常地複雜及混亂, 但是 model 郤空空如也. 結果白白浪費了這麼好用的 framework, 將來需要擴充是亦會令人相當頭痛. 但另一方面, 要是能夠好好的熟習這類 framework, 要開發 web app 時就更加得心應手.