特性 CakePHP有多個特點,這些特點讓CakePHP成為了快速開發框架中的佼佼者之一。
擁有既友好又活躍的社區
資料庫互動運用了CRUD(create, read, update and delete),即增查改刪。
代碼自動產生(代碼產生器)
MVC體系架構
清晰,乾淨的高度自定義的URLs和路由請求分發器(Request dispatcher)
內置驗證機制(validation)
快速靈活的模板機制 (PHP 語法,利用Helpers)
郵件、Cookie、安全、會話(Session),和請求處理的組件
數據的清理(Data Sanitization)
靈活的視圖快取(Flexible View Caching)
可在任何子目錄里工作,很少甚至不需要更改任何
Apache 相關配置
本地化
CakePHP LOGO 基本原則 CakePHP 框架提供了強大的基礎來建立你的套用。它可以處理每個細節,從用戶的不同請求,到網頁的最終渲染。由於框架符合 MVC 設計模式思想,所以可以輕鬆地定製和擴展你的套用。
該框架也提供了一個基本的組織結構,從檔案名稱到資料庫表名,使你的整個套用保持一致性和邏輯性。這個概念雖簡單但非常強大。遵守規則,會使你確切地知道東西在哪兒和它們怎么組織的。
CakePHP的結構
控制器 (Controller),模型 (Model) 及視圖 (View) 是 CakePHP 的特色,除此之外它也包含了一些附加的
類和對象 ,使得在 MVC 設計模式下開發更快更有樂趣。組件 (Component)、行為 (Behavior) 及助手 (Helper),提供了可擴展性及可重用性來快速新增功能到你的套用中。現在,我們將站在較高的層級上,接著開始尋找一些關於如何使用這些工具的細節。
一次典型的CakePHP請求
我們已經看過CakePHP的基本成分了,那么現在就來看看各個對象怎么完成一個基本的請求。繼續講我們之前的請求的例子,想像一下我們的朋友Ricardo剛剛在一個CakePHP的套用的首頁上點擊了“立刻買一個自定義的蛋糕!”這個連結。
圖2. 典型的Cake請求 黑色 = 請求的元素, 灰色 = 可選的元素, 藍色 = 回調方法
1.Ricardo 點擊了指向一個URL 的連結, 然後他的瀏覽器對你的伺服器發出了一個請求。
2.
路由 (route)從URL中解釋並提取出這次請求的參數: 控制器(controller), 動作(action)以及其他在這次請求中影響到業務邏輯的所有其他參數。
3.使用路由後,請求的URL被映射到一個控制器的動作中(在特定的一個控制器的類的一個方法)。在這個例子,是CakeController類的buy()方法。在控制器的所有動作邏輯執行之前會調用beforeFilter()回調方法(callback)。
4.控制器可能會使用模型來處理套用的數據。在這個例子裡,控制器使用了一個模型從數據里得到Ricardo上次買的東西。在這次操作中所有這個模型適用的回調方法、習慣(behavior)和數據源(DataSource)都可能得到實施。即使模型沒有被用到,所有的CakePHP控制器的初始化至少都需要一個模型。
5.當模型取得數據後,數據會被返回到控制器。模型的回調方法可能會被實施。
6.控制器可能使用組件對數據進行進一步的加工,或者進行其他的操作(例如會話處理、驗證或者發電子郵件)。
7.一旦控制器使用了模型和組件以有效地準備數據,就可以使用控制器的set()方法把
數據傳送 到視圖(view)。在數據送到視圖前,控制器的回調方法可能會被實施。視圖邏輯會被執行,可能包括了各種元素及(或者)幫助方法。默認情況下,視圖會在一個布局(layout)里被渲染。
8.附加的控制器回調方法(像afterFilter)可能被實施。最後,完整的經過渲染的視圖代碼就被送到Ricardo的瀏覽器了。
CakePHP 文檔結構
在你下載並且解壓縮之後,在CakePHP目錄下會看到這樣一些檔案和目錄:
1. app
2. cake(較高的cakephp版本是lib/Cake)
3. vendors
4. .htaccess
5. index.php
6. README
其中有三個主要的目錄:
1.app 目錄,將是你施展魔術之處——放置你應用程式的地方。
2.cake 目錄,是CakePHP的核心代碼,請不要 隨意修改這裡邊的代碼,除非你確信自己有這個能力。
3.vendors 目錄,是放置第三方PHP庫的地方。如果在開發過程中還引入一些除CakePHP之外的庫,最好放在這個目錄下,便於代碼的管理。
config
擁有一些CakePHP使用的設定。資料庫連結的詳細資訊、啟動組態、核心設定檔案及許多應該被儲存在這裡的檔案。
controllers
包含你的套用程式控制器及它們的組件。
locale
儲存用來國際化的字元檔案。
models
包含你的套用程式模型、行為和資料來源。
plugins
包含外掛程式包裹。
tmp
這是用來儲存CakePHP暫存資料的。實際上儲存的資料是看你如何設定CakePHP,但這個資料夾通常用來儲存模型描述、記錄檔和會談資訊。
vendors
所有的第三方類別或函式庫應該被放置在這個資料夾。可以簡單的以App::import('vendor', 'name')使用它們。也許你會覺得多餘或困惑於此處有vendors而上一層目錄內也有vendors資料夾,這其中的差異是當我們討論到管理多套用程式和較為複雜的系統設定時,可以使用不同的配置。
views
展示層的檔案被放置在此處:元素、錯誤頁面、小幫手、布局和視圖檔案。
webroot
在產品安裝模式下,這個資料夾應該是套用程式的根目錄。包含了樣式表、影像和JavaScript檔案可放置的資料夾。
CakePHP命名規則
我們是命名規則的擁護者。雖然需要花費一點時間來學習CakePHP的命名規則,你省下更多時間在開發上:根據以下的命名規則,你得到不需花錢的功能,以及你將自己從搜尋設定檔維護的惡夢中釋放出來。命名規則達成一致的系統開發,允許其它的開發者較容易加入或是提供協助
CakePHP的命名規則從許多開發者多年的經驗及一些慣例篩選出來。儘管我們建議你開發時使用命名規則,我們應該提及大部份這些規則簡單又直觀,特別是在修改舊有系統時較為輕鬆容易。
MVC MVC的定義 CakePHP遵循
MVC 軟體開發模式。 程式開發設計使用MVC分開你的應用程式為三個主要的部分:
1.模型(Model):就是封裝數據和所有基於對這些數據的操作
2.視圖(View):就是封裝的是對數據顯示,即用戶界面
3.控制器(Control):就是封裝外界作用於模型的操作和對數據流向的控制等,簡單來說就是負責處理和分發客戶的請求
圖示 1顯示了一個在CakePHP中的大概的MVC請求範例。舉例說明,假設一個名叫"Ricardo"的客戶剛剛點擊了一個“現在購買一個客戶自定義的Cake!”的連結在你的應用程式頁面。
1.Ricardo 點擊一個連結指向 URL, 並且他的瀏覽器向你的web server傳送了一個請求。
圖示1 2.接著這個分發器檢查 URL請求,並且協助這個請求指到正確的控制器。
3.這個控制器就會執行特定的應用程式邏輯。例如,他將檢查看Ricardo是否已經登入。
4.這個控制器也使用模式去獲得應用程式數據層的數據。模式通常展現資料庫表,但是他們同時也展現(呈現)
LDAP (輕量級
目錄訪問協定 )入口 entries,
RSS feeds, 或者系統檔案。在這個範例中, 這個控制器使用了一個模式(model)從資料庫中去抓取、擷取Ricardo的最近的訂單。
5.一旦控制器已經開始魔法似的處理那些數據,他支配了那些數據成為一個視圖。 視圖的得到這個數據並且讓它為展現給客戶準備好。 在CakePHP視圖通常是使用HTML格式, 但是一個視圖應該能夠很容易的成為一個 PDF, XML 文檔, 或者 JSON 對象依賴於你的需求。
6.一旦視圖從控制器中獲得數據就會呈現一個完成的編譯好的視圖給大家,那個視圖的內容將會被返回到Ricardo的瀏覽器。
差不多每次請求你的應用程式都將遵循這個基本原則。稍後我們將會增加一些關於CakePHP這方面的細節,所以當我們繼續下去時請謹記此點。
為何使用MVC 為什麼要用 MVC模式 呢? 因為它是一個經過考驗的真正的
軟體設計模型 ,它可以使程式成為可維護的、模組化的和快速開發的包。使用分離的模型(Model)、視圖(View)和控制器(Controller)組織的程式是輕便的。新的特性很容易就被加入,舊的程式換上新的外觀也是一下子的功夫。模組化和分離的設計使得開發者和設計者能夠同時工作,這包括了
快速原型 的能力。分離的設計令開發者可以修改套用的一部分而不會影響到其他部分。
如果你從來沒有用過這種方法建立套用,適應它需要一些努力,但是我們相信一旦你使用CakePHP建立了你的第一個套用,你不會再想用其他方法建立你的套用了。
開發 必要條件
1.HTTP Server. 最好是帶 mod_rewrite模組的 Apache , 但不是必要條件.
2.PHP 4.3.2 或更高版本, 沒錯, CakePHP 可以在
php4 或是5下面運行.
技術上來說, 資料庫不是必需的,但我們構想每個套用都會用到資料庫,cakephp 支持大部分資料庫::
1.MySQL
2.PostgreSQL
3.Firebird DB2
4.Microsoft SQL Server
6.SQLite
7.ODBC
8.ADOdb
準備安裝
CakePHP 運行很快並且很容易安裝。最小的安裝環境就需要一個伺服器和一份Cakephp的拷貝就行了。很簡單的。然而這份文檔主要對如何在
apache 伺服器下進行安裝進行說明,(因為apache是當前最流行的伺服器)。你可以配置cakephp讓它在LightHTTPD 或者 Microsoft IIS 伺服器下運行。
1.下載一份CakePHP
2.配置你的伺服器讓它支持php(如果必要的話)
3.檢查檔案許可權
安裝
安裝CakePHP可以簡單到直接把它丟入你網頁伺服機的主目錄中, 也可以複雜並如你希望般的彈性. 在這部分我們將含括三種安裝方式: 開發模式, 實際套用與高級安裝.
1.開發模式: 簡單又快速, URLs中將包含CakePHP的
安裝目錄 , 並不十分安全.
2.實際套用: 必須調試伺服機之主目錄, 簡潔的URLs, 非常安全.
3.高級安裝: 通過一些調試, 能讓你把CakePHP主程式放在指定的地方, 更可能讓不同的CakePHP分享同樣的CakePHP主程式.
配置
配置CakePHP應用程式是一件很有意思的事情。在你安裝完CakePHP之後,創建一個基本的web應用程式只需要你配置一下資料庫
然而,還有很多其他可選的配置用於適用CakePHP更高級的一些特性。你可以通過繼承的方法為CakePHP核心增加功能、配置你自己的路由,或者定義你自己的映射。
控制器(Controllers)
控制器是用來控制邏輯的。通常,控制器會來控制一個獨立的模型。舉例,如果你要建立一個線上的麵包店,你要有 RecipesController 和 IngredientsController 這兩個控制器來控制食譜 (Recipe) 和配料 (Ingredient)。在 CakePHP 會以複數的方式命名控制器。
RecipesController 控制 Recipe 模型,ProductsController 控制 Product 模型,依此類推。
一般我們所創建的
控制類 都繼承 CakePHP 的 AppController 類。AppController 繼承自 Controller 類AppController 在/app/app_controller.php 檔案里定義,它包含很多函式,你的應用程式裡面所有的控制器類都要共享這些函式。Appcontroller類的父類Controller類在 CakePHP 標準庫中定義。
控制器里的函式通常都會跟 動作 (action) 關聯。Action 是用來顯示視圖 (View) 的控制器的函式。一個 action 就是控制器的一個單獨的函式。
當一個URL請求匹配和控制器的動作匹配的時候,CakePHP的分發器調用相應的動作完成這個請求。
組件(Components)
組件是封裝了一定邏輯處理的,可以在控制器間共享使用的包。當你發現你總是需要在不同的控制器間來回拷貝代碼的時候,也許就是時候把這些可以共有的代碼打個包,寫成組件了。
CakePHP也提供了很多很好用的內置組件:
Security、Sessions、Access control lists、Emails、Cookies、Authentication、Request handling
模型(Models)
模型是數據的表現,在CakePHP中被用來進行數據的訪問。通常情況下一個模型對應一張資料庫表,不過也可以用來訪問其他的數據容器,比如檔案,LDAP記錄,iCal事件或者CSV檔案的行。
一個模型可以與其他的模型建立相互的關係。比如,一張食譜可能會有一位作者作為其要素之一。
行為(Behaviors)
模組的行為是一種用來組織CakePHP模組里定義的某些功能的方法.它使我們可以把那些不是與模組直接相關但又需要的邏輯獨立出來。通過提供一種簡單但強大的方法來擴展模組,行為(Behaviors)允許我們通過簡單地定義一個
類變數 來加入方法。這就是行為(Behaviors)如何允許模組去掉所有額外的體重,比如可能不是他們正在建模的商業契約的一部分,或是另一個模組才需要的並且可以被推測出來的部分。
舉個例子,比如一個模組,它允許我們取得資料庫里用來存關於樹的信息結構數據。在一個樹里刪除、新增和遷移結點並不像刪除、插入和修改表中的一行數據那樣簡單。很多個記錄可能需要被更新隨著結點的移動。相比在每個模組中建立這些樹操作的方法,我們可以簡單地告訴模組去使用TreeBehavior,或者更正式地來說,我們告訴我們的模組,讓它們像一個樹一樣來行為。這就是所謂的追加一個行為到模組。只需要用一行代碼,我們的CakePHP模組就獲得了一整套的方法,從而使它可以根據它的結構來互相操作。
數據源
數據源是連線模型和其所代表的數據之間的橋樑。多數情況下,數據被存儲在像MySQL,PostgreSQL,或者MSSQL等關係資料庫中。CakePHP本身集成了大部分的既有資料庫的特定數據源(參考cake/libs/model/datasources/dbo/中的dbo_*等類庫檔案 ), 為了方便把這些數據源在此做個簡單的列表:
1.dbo_mssql.php
2.dbo_mysql.php
3.dbo_mysqli.php
5.dbo_postgres.php
6.dbo_sqlite.php
視圖(View)
CakePHP的視圖層是展現給用戶看到的部分。多數情況下視圖應該是供瀏覽器使用的(X)HTML文檔,但也可能是提供給Flash組件的AMF數據,或者通過SOAP回響伺服器端應用程式,甚至傳送給用戶的CSV檔案。
CakePHP視圖使用PHP文本編寫,默認擴展名.ctp (意為CakePHP Template)。這些檔案涵蓋了從控制器接收數據並按指定格式呈現給用戶的所有表現邏輯。
視圖檔案存放在/app/views/目錄下,在以控制器名稱命名的資料夾中,以正訪問的action名稱命名的檔案。例如,Products控制器中有一個"view()" action, 那么與之對應的視圖檔案應該就是/app/views/products/view.ctp。
助手(Helper)
助手(Helper) 是類似組件的類,用於你的應用程式的表現層里。它們包括了一些視圖(view),元素(element)或布局(layout)共用的表現層邏輯。
腳手架(Scaffolding)
應用程式腳手架是一種允許開發人員快速定義和創建查、刪、改、增程式(CRUD)的技術。CakePHP的腳手架還允許開發人員定義對象之間如何相互聯合,以及創建和取消它們之間的關聯。
創建腳手架所需要的全部只不過是一個model以及它的控制器。只要在控制器中設定了$scaffold變數,基本上就搞定了。
CakePHP的腳手架那是相當的酷。它可以讓你在幾分鐘之內創建一個基本的CRUD程式出來。如此之酷你可能會將其用於產品環境中去。儘管我們也認為它很酷,但請你一定要認識到腳手架嘛。。。嗯。。。始終只是個腳手架。它擁有一個大致的結構,這樣可以讓你在項目初期能夠快速起步。這並不意味著它很靈活,而是說它只是起步時的一個臨時途徑。當你發現需要自定義邏輯和視圖的時候,也就是該拆除腳手架開始寫代碼的時候了。CakePHP的Bake控制台,在下一節我們會講到,是非常重要的下一步:它能夠生成多數當前腳手架功能相同的代碼。
腳手架在WEB程式早期的時候是一個不錯的選擇。
資料庫設計 初期會經常改動,在設計過程早期這是相當正常的現象。但有個負面作用:WEB開發人員討厭創建了
表單 但卻看不到實際的套用。為了減輕開發人員的壓力,CakePHP已經內置了腳手架。腳手架分析數據表,並且創建標準的帶添加、刪除和編輯按鈕的列表,編輯用的標準表單以及檢視資料庫單條記錄的視圖。
外掛程式(Plugins)
CakePHP允許將創建的控制器、模型和視圖聯合起來打包發布,作為其它CakePHP程式可以使用的外掛程式。在應用程式中有比較棒的用戶管理模組?或者簡單的部落格?抑或web services模組?將它打包成外掛程式就可以在其它程式中使用了。
外掛程式與安裝它的應用程式之間最主要的聯繫是應用程式的配置(如資料庫連線等等)。否則,它只會對它自己的領空生效,就像一個獨立的應用程式一樣。
核心組件 CakePHP 有大量的內置組件 (component)。它們可以直接使用在你的應用程式中。
Acl
Acl 訪問控制列表組件提供一個簡單易用的資料庫接口和基於ini檔案的訪問控制列表。
Auth
Auth 認證組件提供了一個簡單易用的認證系統,使用多種認證過程,如 Controller 回調、ACL 或者Object 回調。
Session
會話組件是 PHP Session 的獨立存儲的包裝器。
RequestHandler
RequestHandler 組件分析訪問者的請求,和給套用提供關於內容類型 (Content Type) 和被請求的信息。
Security
安全組件允許你做非常嚴格的安全設定和管理HTTP驗證。
Email
使用多種郵件傳輸代理髮送郵件,包括使用 PHP 的 mail() 和 SMTP。
Cookie
Cookie 組件類似 SessionComponent,可以理解為 PHP Cookie 的一個包裝器。
核心行為 ACL
Acl行為提供一種將模型與ACL系統無縫的結合方法。 它能透明地創建ARO或者ACO
Containable
使用 Containable 可以減少無謂的資料庫檢索,從而增加套用的回響速度和整體性能。也會使搜尋和過濾數據的過程變得清晰和一致。
Tree
在數據表中以層次結構存儲數據是相當普遍的。例如這些數據可能是擁有無限級子目錄的目錄數據,多層目錄相關數據,或者是層次結構的文字展現(如ACL邏輯中的訪問控制對象(ACO))。
核心助手 Helpers就像表現層的Component類。它包含了表現層的邏輯,可以供其他views,elements或者layouts調用。
這部分描述了CakePHP自帶的每一個helepers,如Form, Html, JavaScript and RSS等
AjaxHelper 使用 Prototype ,用來提供 Ajax 操作和前端效果。 使用 AjaxHelper 之前, 你必須下載它們的 JavaScript 庫,並放到 /app/webroot/js/ 下。 除此之外, 你需要在使用 AjaxHelper 功能的任何 layouts 和 views 檔案中引入它們。
FormHelper是CakePHP一個新的附加功能。表單創建的大部分粗重工作現在都由這個新類來完成,取代(現在不推薦使用)HtmlHelper中的方法。FormHelper主要聚焦於快速創建表單, 流程化的數據校驗,頁面的重複構造和布局。FormHelper同樣也很靈活-它幾乎可以自動的完成所有事情,但你也可以指定方法完成你所需要的功能。
HTML Helper是Cake用來使開發變得迅速且不會乏味的一個好方法。HTML Helper有兩個主要的目的:幫助插入那些經常用到的HTML代碼,幫助更快更方便的創建一個Form。
Javascript helper旨在幫助開發人員輸出良好格式的JS相關tag和數據。
Number
Number helper中包含了一些非常出色的函式,可以幫助你格式化數值型數據。
Paginator
分頁Helper用來輸出分頁控制項,如頁碼、下一頁/上一頁之類的連結。
Text helper提供了一些格式化文本數據的函式。
Time
Time helper提供了一些函式供程式設計師輸出諸如Unix時間戳格式或者是更加易讀的日期字元串。 所有的函式都能夠接受合法的PHP日期字元串或者是Unix時間戳格式的參數。
工具庫 CakePHP 包含普通用途的工具庫,它們可以在你的應用程式的任何地方被訪問,比如Set和HttpSocket.
應用程式 CakePHP有一定數量的盒子外面的控制台應用程式。有些應用程式是用來連線其它CakePHP功能的(比如ACL或i18n), 另外的則是一般的用途,它們被用來使你的開發啟動更快。