cakephp
快速開發框架
CakePHP是一個運用了諸如ActiveRecord、Association Data Mapping、Front Controller和MVC等著名設計模式的快速開發框架。該項目主要目標是提供一個可以讓各種層次的PHP開發人員快速地開發出健壯的Web應用,而 又不失靈活性。
CakePHP是一個基於PHP,免費且開源的迅速發展框架最開始從Ruby On Rails框架里得到靈感。
它提供程序員所需要的基本體系架構,因此程序員可以使用它更快速且不失靈活性地創建網路應用程序。而這就是我們創造 CakePHP 的首要目的。
大家對網路開發那千篇一律的步驟或許感到厭煩了。CakePHP 因此提供了開發一個網路程序時所需要的所有工具,您這時只需要編寫程序里的詳細邏輯就可以了。那每當您要開始一個新的程序的時候,您只需要把 CakePHP 給拷貝一份,接著就可以迅速地開始開發您的程序了。
CakePHP 擁有一個活躍的開發團隊以及社區,使 CakePHP 本身更具備應有的價值。另外,使用 CakePHP 也意味著您的應用程序將更容易地測試以及更容易地被改良、更新。
CakePHP有多個特點,這些特點讓CakePHP成為了快速開發框架中的佼佼者之一。
擁有既友好又活躍的社區
靈活的MIT許可證
兼容PHP4和PHP5(2.x版本已不兼容PHP4)
資料庫交互運用了CRUD(create, read, update and delete),即增查改刪。
應用程序Scaffolding(腳手架)
代碼自動產生(代碼產生器)
MVC體系架構
清晰,乾淨的高度自定義的URLs和路由請求分發器(Request dispatcher)
內置驗證機制(validation)
快速靈活的模板機制(PHP 語法,利用Helpers)
擁有AJAX, JavaScript, HTML表單和更多的視圖助手工具
郵件、Cookie、安全、會話(Session),和請求處理的組件
靈活的ACL訪問控制機制
數據的清理(Data Sanitization)
靈活的視圖緩存(Flexible View Caching)
可在任何子目錄里工作,很少甚至不需要更改任何Apache相關配置
本地化
1.
CakePHP有多個特點,這些特點讓CakePHP成為了快速開發框架中的佼佼者之一。
2.
擁有既友好又活躍的社區
3.
靈活的MIT許可證
4.
兼容PHP4和PHP5(2.x版本已不兼容PHP4)
5.
資料庫交互運用了CRUD(create, read, update and delete),即增查改刪。
6.
應用程序Scaffolding(腳手架)
7.
代碼自動產生(代碼產生器)
8.
MVC體系架構
9.
清晰,乾淨的高度自定義的URLs和路由請求分發器(Request dispatcher)
10.
內置驗證機制(validation)
11.
快速靈活的模板機制(PHP 語法,利用Helpers)
12.
擁有AJAX, JavaScript, HTML表單和更多的視圖助手工具
13.
郵件、Cookie、安全、會話(Session),和請求處理的組件
14.
靈活的ACL訪問控制機制
15.
數據的清理(Data Sanitization)
16.
靈活的視圖緩存(Flexible View Caching)
17.
可在任何子目錄里工作,很少甚至不需要更改任何Apache相關配置
18.
本地化
CakePHP LOGO
CakePHP 框架提供了強大的基礎來建立你的應用。它可以處理每個細節,從用戶的不同請求,到網頁的最終渲染。由於框架符合 MVC 設計模式思想,所以可以輕鬆地定製和擴展你的應用。
該框架也提供了一個基本的組織結構,從文件名到資料庫表名,使你的整個應用保持一致性和邏輯性。這個概念雖簡單但非常強大。遵守規則,會使你確切地知道東西在哪兒和它們怎麼組織的。
CakePHP的結構
控制器 (Controller),模型 (Model) 及視圖 (View) 是 CakePHP 的特色,除此之外它也包含了一些附加的類和對象,使得在 MVC 設計模式下開發更快更有樂趣。組件 (Component)、行為 (Behavior) 及助手 (Helper),提供了可擴展性及可重用性來快速新增功能到你的應用中。現在,我們將站在較高的層級上,接著開始尋找一些關於如何使用這些工具的細節。
一次典型的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的命名規則從許多開發者多年的經驗及一些慣例篩選出來。儘管我們建議你開發時使用命名規則,我們應該提及大部份這些規則簡單又直觀,特別是在修改舊有系統時較為輕鬆容易。
CakePHP遵循MVC軟體開發模式。程序開發設計使用MVC分開你的應用程序為三個主要的部分:
1.模型(Model):就是封裝數據和所有基於對這些數據的操作
2.視圖(View):就是封裝的是對數據顯示,即用戶界面
3.控制器(Control):就是封裝外界作用於模型的操作和對數據流向的控制等,簡單來說就是負責處理和分發客戶的請求
圖示 1顯示了一個在CakePHP中的大概的MVC請求範例。舉例說明,假設一個名叫"Ricardo"的客戶剛剛點擊了一個“現在購買一個客戶自定義的Cake!”的鏈接在你的應用程序頁面。
圖示1
2.接著這個分發器檢查 URL請求,並且協助這個請求指到正確的控制器。
3.這個控制器就會執行特定的應用程序邏輯。例如,他將檢查看Ricardo是否已經登陸。
4.這個控制器也使用模式去獲得應用程序數據層的數據。模式通常展現資料庫表,但是他們同時也展現(呈現) LDAP(輕量級目錄訪問協議)入口 entries, RSSfeeds, 或者系統文件。在這個範例中,這個控制器使用了一個模式(model)從資料庫中去抓取、擷取Ricardo的最近的訂單。
5.一旦控制器已經開始魔法似的處理那些數據,他支配了那些數據成為一個視圖。視圖的得到這個數據並且讓它為展現給客戶準備好。在CakePHP視圖通常是使用HTML格式,但是一個視圖應該能夠很容易的成為一個 PDF, XML 文檔, 或者 JSON 對象依賴於你的需求。
6.一旦視圖從控制器中獲得數據就會呈現一個完成的編譯好的視圖給大家,那個視圖的內容將會被返回到Ricardo的瀏覽器。
差不多每次請求你的應用程序都將遵循這個基本原則。稍後我們將會增加一些關於CakePHP這方面的細節,所以當我們繼續下去時請謹記此點。
為什麼要用 MVC模式 呢? 因為它是一個經過考驗的真正的軟體設計模型,它可以使程序成為可維護的、模塊化的和快速開發的包。使用分離的模型(Model)、視圖(View)和控制器(Controller)組織的程序是輕便的。新的特性很容易就被加入,舊的程序換上新的外觀也是一下子的功夫。模塊化和分離的設計使得開發者和設計者能夠同時工作,這包括了快速原型的能力。分離的設計令開發者可以修改應用的一部分而不會影響到其他部分。
如果你從來沒有用過這種方法建立應用,適應它需要一些努力,但是我們相信一旦你使用CakePHP建立了你的第一個應用,你不會再想用其他方法建立你的應用了。
必要條件
1.HTTP Server. 最好是帶 mod_rewrite模塊的 Apache , 但不是必要條件.
2.PHP 4.3.2 或更高版本, 沒錯, CakePHP 可以在php4 或是5下面運行.
技術上來說, 資料庫不是必需的,但我們設想每個應用都會用到資料庫,cakephp 支持大部分資料庫::
1.MySQL
3.Firebird DB2
4.Microsoft SQL Server
5.Oracle
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 標準庫中定義。
當一個URL請求匹配和控制器的動作匹配的時候,CakePHP的分發器調用相應的動作完成這個請求。
組件(Components)
組件是封裝了一定邏輯處理的,可以在控制器間共享使用的包。當你發現你總是需要在不同的控制器間來回拷貝代碼的時候,也許就是時候把這些可以共有的代碼打個包,寫成組件了。
CakePHP也提供了很多很好用的內置組件:
模型(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
4.dbo_oracle.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驗證。 |
使用多種郵件傳輸代理髮送郵件,包括使用 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等
AJAX | AjaxHelper 使用 Prototype ,用來提供 Ajax 操作和前端效果。使用 AjaxHelper 之前,你必須下載它們的 JavaScript 庫,並放到 /app/webroot/js/ 下。除此之外,你需要在使用 AjaxHelper 功能的任何 layouts 和 views 文件中引入它們。 |
Form | FormHelper是CakePHP一個新的附加功能。表單創建的大部分粗重工作現在都由這個新類來完成,取代(現在不推薦使用)HtmlHelper中的方法。FormHelper主要聚焦於快速創建表單,流程化的數據校驗,頁面的重複構造和布局。FormHelper同樣也很靈活-它幾乎可以自動的完成所有事情,但你也可以指定方法完成你所需要的功能。 |
HTML | HTML Helper是Cake用來使開發變得迅速且不會乏味的一個好方法。HTML Helper有兩個主要的目的:幫助插入那些經常用到的HTML代碼,幫助更快更方便的創建一個Form。 |
Javascript | Javascript helper旨在幫助開發人員輸出良好格式的JS相關tag和數據。 |
Number | Number helper中包含了一些非常出色的函數,可以幫助你格式化數值型數據。 |
Paginator | 分頁Helper用來輸出分頁控制項,如頁碼、下一頁/上一頁之類的鏈接。 |
Text | Text helper提供了一些格式化文本數據的函數。 |
Time | Time helper提供了一些函數供程序員輸出諸如Unix時間戳格式或者是更加易讀的日期字元串。 所有的函數都能夠接受合法的PHP日期字元串或者是Unix時間戳格式的參數。 |
CakePHP 包含普通用途的工具庫,它們可以在你的應用程序的任何地方被訪問,比如Set和HttpSocket.
CakePHP有一定數量的盒子外面的控制台應用程序。有些應用程序是用來連接其它CakePHP功能的(比如ACL或i18n), 另外的則是一般的用途,它們被用來使你的開發啟動更快。