2010年2月22日 星期一

CakePHP教學 on OSX(七)Blog練習:(2)Blog資料庫設計

RoRy框架中有一個"資料遷移(mirgate)"物件,可以用Ruby語法透過自動地在資料庫中產生對應的資料庫架構(schema),學習上的好處是可以省去花在資料庫設計與結構查詢語言(SQL)上的功夫,只要專心熟悉Ruby語法即可。

而CakePHP則是相反地,是透過讀取一個既有的(通常是MySQL)資料庫架構,來產生相對的資料模型、控制器與視圖程式碼。因此預先設計並建立好一個資料庫,對於應用CakePHP框架來說非常重要,也比較符合PHP開發者原有的習慣。

Blog資料庫
首先應用之前“Todo”練習建立資料庫的方法,透過phpMyAdmin建立一個“blog”資料庫,以及同名的使用者“blog”並設定權限與密碼。

Blog資料表設計
跟之前“Todo”練習的資料庫只有一個資料表不同,Blog的資料必須分別使用多個資料表來儲存,並透過資料庫的關連功能來取得相關的資料。

第一個是“users”資料表的SQL:
CREATE TABLE  `users` (
 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
 `name` VARCHAR(100) DEFAULT NULL ,
 `email` VARCHAR(150) DEFAULT NULL ,
 `firstname` VARCHAR(60) DEFAULT NULL ,
 `lastname` VARCHAR(60) DEFAULT NULL ,
 `created` DATETIME DEFAULT NULL ,
 `modified` DATETIME DEFAULT NULL ,
 PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
依照CakePHP的命名慣例,“users”資料表名稱必須是複數名詞,主鍵(PRIMARY KEY)名稱是“id”。

第二個是“posts”資料表的SQL:
CREATE TABLE  `posts` (
 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
 `title` VARCHAR(255) DEFAULT NULL ,
 `content` TEXT,
 `user_id` INT(11) DEFAULT NULL ,
 `created` DATETIME DEFAULT NULL ,
 `modified` DATETIME DEFAULT NULL ,
 PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
依照CakePHP的命名慣例,“posts”資料表名稱也必須是複數名詞,主鍵(PRIMARY KEY)名稱也是“id”。為了避免混淆並指定關連的資料表,這裡以“user_id”欄位與“users”資料表建立關連性。注意,這裡“user_id”欄位是單數詞。還有跟書上的不同,這裡還是用“created”跟“modified”兩個魔術欄位來自動儲存製作與修改日期。

“users”跟“posts”兩個資料表的關係是所謂的“一對多”,也就是每一位“user”有很多篇的“posts”,但每一篇“post”只屬於一位“user”所有。用RoR框架開發時,要在資料模型程式中指明“user”跟“posts”兩個物件的關係,然後RoR會自動地在資料庫中產生相對的資料表。而用CakePHP開發時,CakePHP則是透過分析“user”跟“posts”兩個資料表,來產生資料模型程式的範本。


上一篇下一篇:

2010年2月17日 星期三

CakePHP教學 on OSX(七)Blog練習:(1)命名習慣

CakePHP沿襲RoR的觀念,使用“慣例優於組態(Convention over Configuration)”的“設計典範(Design Paradigm)”。因此不論是程式檔案與功能函式的名稱、放置程式檔案的目錄名稱與路徑、或是資料庫表格的名稱與欄位的設計,都有一定的命名慣例。

依循慣例設計程式的好處,一方面可以讓CakePHP這種程式框架可以自動地產生相關的程式樣板以加速程式的開發的速度;另一方面也方便開發者閱讀與理解程式與函式之間的關聯性,方便程式的管理與維護。唯一的缺點,就是要注意英文名詞的單複數問題,避免使用程式框架已經使用到的關鍵字詞,同時要不小心迷失在一堆複雜的檔案路徑之中。

“類大檔小”與“模單表複”慣例
CakePHP是採用物件導向的程式編寫範式,因此每個程式檔案就是一個“類別(class)”。程式語法中,類別的名稱用“駝峰式命名法”,每個詞的第一個字母大寫,多個詞之間不留空白;但是程式檔案名稱則是全部小寫,多個詞之間要用“_”符號分開。

因為英文名詞有單複數的分別,所以基本上CakePHP命名方式也有單複之分。除了“模型(model)”類別通常是以(一個詞或多個詞組合的)單數名詞命名之外,“控制器(controller)”、“視圖(view)”程式,以及儲存模型的“資料表(table)”等等,都是以“複數名詞”命名。除非是“單複數同形”的名詞,不要忘了開加上“s”、“es”或“ies”的地方要正確(這是考托福嗎!?),以免整個CakePHP程式框架因為命名問題運作出錯。

因此按照CakePHP的命名方式,一個“User”類別有關的所有程式的命名與路徑如下:
模型:程式根目錄/models/user.php
class User extends AppModel {
    var $name = 'User';
    ....
}

控制器:程式根目錄/controllers/users_controller.php
class UsersController extends AppController {
    var $name = 'Users';
    ....
    function index() {
        ....
    }
}

視圖:程式根目錄/views/users/動作函式名稱.ctp
視圖檔案可以針對控制器中個別的動作函數指定,例如控制器UsersController之中的index函數的視圖檔案,應該是:程式根目錄/views/users/index.ctp

還好,大部份的時候我們可以用CakePHP提供的bake程式把這些檔案範本製作出來,不用自己傷腦筋命名問題。不過熟記這些命名與路徑慣例,對於修改與維護程式功能就很有用。不過跟RoR架構不同,CakePHP要先把資料庫架構好,才能用bake指令自動地“烤”出應用程式。
上一篇下一篇:資料庫設計