我們是約定優(yōu)于配置的忠實(shí)信徒。花費(fèi)很少的時(shí)間來學(xué)習(xí) CakePHP 的約定,長(zhǎng)遠(yuǎn)來看,會(huì)節(jié)省你的時(shí)間:通過遵循約定,你能夠獲得免費(fèi)的功能,并且可以從維護(hù)和追蹤配置文件的夢(mèng)魘中解脫。約定還造成了系統(tǒng)開發(fā)的統(tǒng)一性,使其他程序員更易于加入和提供幫助。
CakePHP 約定提煉于多年的 web 開發(fā)經(jīng)驗(yàn)和最佳實(shí)踐。 我們建議你在用 CakePHP 編程時(shí)使用這些約定,但是我們也要說明這些原則很容易覆蓋 ―― 在與遺留的系統(tǒng)一同工作時(shí),有些東西非常有用。
控制器類名是復(fù)數(shù)的、駝峰格式,并且使用 Controller 結(jié)尾。 PeopleController 和 LatestArticlesController 都是約定類名的例子。
為控制器編寫的第一個(gè)方法很可能是 index() 方法。 當(dāng)只指定了控制器,但沒有指定動(dòng)作(action)時(shí),CakePHP 的默認(rèn)行為是執(zhí)行這個(gè)控制器的 index() 方法。 例如: 請(qǐng)求會(huì)調(diào)用ApplesController 的 index() 方法,而調(diào)用 ApplesController 的 view 方法。
在 CakePHP 中,你還可以通過在控制器方法的名稱前添加下劃線來改變其可見性。 如果一個(gè)控制器方法以一個(gè)下劃線開頭,這個(gè)方法將不能通過 web 訪問,但可以在內(nèi)部使用。例如:
用戶可以象通常那樣訪問, 一些人嘗試訪問就會(huì)得到一個(gè)錯(cuò)誤, 因?yàn)檫@個(gè)方法是以下劃線開頭的。 你還可以使用 PHP 的可見性關(guān)鍵詞來指定一個(gè)方法是否能通過 url 訪問。非公有的方法將不能被訪問。
正像你看到的那樣,單個(gè)單詞命名的控制器簡(jiǎn)單容易的用小寫的 URL 路徑訪問,ApplesController (在 ‘ApplesController.php’ 定義的)可以通過 訪問。
多個(gè)單詞組成的控制器 能 被下面的幾種功能相同的方法任意扭曲:
都將解析為 RedApples 控制器的 index 方法。但是這個(gè)約定是你的 url 是小寫加下劃線,因此 /red_apples/go_pick 可以正確的訪問 RedApplesController::go_pick 動(dòng)作。
關(guān)于 CakePHP URL 的更多信息和參數(shù)處理,參見 路由配置 。
通常,文件名和類名是相匹配的,也遵守駝峰規(guī)則。因此在 Cake里,如果你的類名是 MyNiftyClass,對(duì)應(yīng)的文件名就是 MyNiftyClass.php。 下面的例子是關(guān)于如何為 CakePHP 應(yīng)用程序中不同類型的類所在的文件命名的經(jīng)典規(guī)則:
每個(gè)文件都存放在 app 文件夾的相應(yīng)子文件夾中。
模型類是單數(shù)、駝峰式的。Person、BigPerson 和 ReallyBigPerson 多寶平臺(tái)都是符合約定的模型命名實(shí)例。
表名與 CakePHP 的模型一致,是單數(shù)的,用下劃線間隔單詞的。表 people、 big_people 和 really_big_people 分別對(duì)應(yīng)上面提及的模型。
可以使用工具庫(kù) 彎曲 檢驗(yàn)單詞的單/復(fù)數(shù)形式。更多信息參見 彎曲 。
兩個(gè)以上單詞構(gòu)成的域名用下劃線間隔,如 first_name 。
hasMany、belongsTo 或者 hasOne 關(guān)系中的外鍵默認(rèn)是用關(guān)系表名帶 _id 來識(shí)別。 所以,如果 Baker hasMany Cake,cake 表將使用 baker_id 外鍵引用 baker 表。對(duì)于多個(gè)單詞構(gòu)成的表,例如 category_types,外鍵就是 category_type_id 。
在模型間使用 hasAndBelongsToMany (HABTM) 關(guān)系連接表,其命名將按照字母順序(apples_zebras 優(yōu)先于 zebras_apples)。
每個(gè) CakePHP 模型中的所有表(包括期望連接的表),僅包含單域主鍵用于唯一標(biāo)識(shí)一個(gè)行。 也許你希望模型表沒有單域主鍵,但 CakePHP 約定要求表加入一個(gè)單域主鍵。如果你想使用表模型,就必須加入一個(gè)單域主鍵。
CakePHP 不支持多域主鍵。如果你想要直接控制你的連接表數(shù)據(jù),使用 query 調(diào)用或者按照默認(rèn)模式加入一個(gè)單域主鍵。例如:
相對(duì)于使用 auto-increment 鍵作為主鍵,你還可以使用 char(36) 類型。Cake 將在你使用 Model::save 方法保存一條記錄時(shí)使用唯一的 36 個(gè)字節(jié)的 uuid (String::uuid) 。
視圖模板文件是用控制器的函數(shù)命名的,用下劃線間隔多個(gè)單詞。PeopleController 類的 getReady() 函數(shù)的視圖模板是 /app/View/People/get_ready.ctp。
基本的模式是 /app/View/Controller/underscored_function_name.ctp。
如果使用 CakePHP 約定命名你的應(yīng)用程序片斷,你不需要維護(hù)配置就可以獲得需要的功能。多寶這是遵循約定的最終實(shí)例:
使用這些約定,Cakephp 知道 請(qǐng)求是要調(diào)用 PeopleController 類的 index() 函數(shù),Person 模型自動(dòng)有效(并且自動(dòng)綁定到數(shù)據(jù)庫(kù)的‘people’表)并渲染一個(gè)文件。這些關(guān)系完全不需要配置,你只需要建立相應(yīng)的文件即可。
現(xiàn)在,你已經(jīng)了解了 CakePHP 的基本原理,多寶你可以試著通過運(yùn)行 博客課程 ,看看它們是怎樣一直工作的。