2007 年 11 月 12 日
短短數年前,對 PHP 最常見批評之一是不支持 MVC 樣式的架構。隨著時代的變遷,現在在 PHP 框架領域里可以獲得多種選擇。本系列將介紹三個廣泛使用的 PHP 框架 —— Zend、symfony 和 CakePHP —— 通過在三個框架中構建和擴展樣例應用程序來檢驗這三個框架的類似之處和不同之處。
“PHP 框架” 系列專門針對那些想要開始使用框架、但又沒有機會詳細檢驗可用框架的 PHP 開發人員。在學完本系列后,您將了解選擇這三個框架的原因、如何安裝每個框架,并且充分運用將在三個框架中擴展的測試應用程序。聽起來要學習的內容很多,但是不必擔心。內容雖然多,但是我們已經把內容細分為多個便于管理的部分。
關于本系列
本系列的第 1 部分將列出本系列涵蓋的內容,介紹將進行考察的框架以及說明如何安裝,并查看將構建的第一個測試應用程序。
第 2 部分將指導您在三個框架中構建樣例應用程序,著重說明了它們的類似之處和不同之處。
第 3 部分從擴展測試應用程序開始,然后處理不符合一般規律的例外情況。所有框架都能很好地完成份內的任務。每個項目中都需要完成一些框架設定工作之外的事情。第 2 部分就將介紹那些情況。
第 4 部分主要介紹了 Ajax 支持。使用本機代碼和第三方庫檢驗了 Ajax 的使用 —— 特別介紹了每個框架如何運行及接受具體的常用庫。
第 5 部分將處理如何在框架外部工作。設定一項任務(每晚更新腳本),并在每個框架中檢驗完成此項任務的過程。
![]() ![]() |
![]()
|
關于本文
本文提供了大量內容。您必須快速地跟上節奏。本文要對三種框架進行審視。是哪三種框架?為什么要針對這三種框架?還有其他哪些框架?為什么不選擇其他框架?太多的問題要解答!但是在執行每個框架的安裝過程之前,大部分問題都將得到回答。然后您將了解本系列后續文章中使用的測試應用程序。您馬上就可以了解不同框架之間有何不同之處以及這些框架都可以實現哪些相同的工作。
系統要求
開始之前,需要具備一定的工作環境。需要滿足的要求包括:
先決條件
假定您已經了解 PHP、應用程序設計,以及如何在數據庫中工作。不要求您具有框架使用經驗,但是您應當已經準備好開始使用框架。
![]() ![]() |
![]()
|
模型框架
在了解哪些框架被選中之前,有必要來討論一下框架是什么。
框架思想就是提供一種可以在多個應用程序中使用的設計。所有應用程序都有大量通用的基本內容 —— 具體地說,就是某類與數據庫的接口、某些應用程序邏輯、應用程序呈現給用戶的內容等。如果您編寫過許多 PHP 應用程序,則會知道這些基本內容是什么。您可能已經編寫過一組函數或從數據庫中讀取數據和向數據庫中寫入數據的類,可能已經使用過諸如 Smarty 之類的模板引擎來管理 UI。而且一定編寫過大量 PHP 代碼來完成諸如分析表單提交并根據提交的數據作決定之類的事務。如果您已經編寫過很多應用程序,則可能已經一次又一次地做過相同的基本工作,有時還會將一個應用程序中的代碼借用到另一個應用程序中。
框架專門用于為這些常用元素(數據庫交互、表示層、應用程序邏輯)提供結構,以便您可以花費更少的時間來編寫數據庫接口代碼或者表示層接口,而花費更多的時間來編寫應用程序本身。以這種方式分解應用程序,這種架構被稱為模型-視圖-控制器(Model-View-Controller,MVC)。模型 指數據,視圖 指表示層,而控制器 指應用程序邏輯或業務邏輯。對 MVC 的完整討論超出本文的范圍,但是鼓勵您研究 MVC 并深入了解 MVC 的一切(請參閱 參考資料)。
![]() ![]() |
![]()
|
選擇框架
每種語言幾乎都有若干個框架可用。選擇剛好滿足需求的框架可能有點難,尤其是當您以前未曾使用過任何一個框架時更是如此。雖然熟悉此領域的同事和可信賴的 developerWorks 作者提供的建議和評價會十分有幫助,但是選擇任何框架時實際上應當遵循的惟一一個指導原則是:框架為每個人 節省的時間和精力越多越好。如果一個框架工作得很好但是會導致產生大量支持調用,那就不是一個優秀框架。如果一個框架易于支持,但是起到的阻礙作用大于輔助開發作用,那也不是一個優秀框架。如果一個框架十分優雅,但是會導致出現支持問題和開發問題,那么這個框架也是沒有用的。
選擇項目框架時,考慮從上到下所有相關人員的意見,并且在評估框架時,考慮到對其他各方的影響。
當考慮采用一個框架時,請進一步審視您的應用程序,并思考該應用程序是不是需要一個框架。框架不是必需品。即使不使用框架,也可以繼續編寫企業應用程序。框架會對項目有幫助么?它是否會節省每個人的時間和精力?您的應用程序在框架中是否會執行得更好?它是否將提供所缺乏的穩定性?如果上面任意一個問題的答案為是,那么您應當考慮采用框架。如果所有這些問題的答案都為否,那么使用框架只會把事情變復雜。
可惜,本文的長度和范圍限制不允許全面介紹所有可用的 PHP 框架。本系列主要介紹三個框架:
選擇這些框架的原因有很多,但可能都屬于這幾類因素:“您老板聽說過的框架”、“某些人已經安裝過的框架” 或者 “曾經談論過的框架”。我鼓勵您研究 CodeIgniter、Seagull、Web Application Component Toolkit (WACT)、PRADO、Zoop、PHP on Trax 或者其他眾多可用 PHP 框架中的一個。框架選擇全憑個人喜好,就像選擇用哪種語言編寫代碼一樣。本系列不會告訴您哪個框架比其他框架更好或更差。哪個框架在某方面做得好,我們就會討論它。哪個框架看上去不實用,我們也會討論它。即使我們不能全面地涵蓋各種框架,我們采用的方法也將幫助您學會衡量其他框架的優點和缺點。您需要對正在檢驗的框架形成自己的觀點,哪些框架您喜歡,并且決定繼續使用哪個框架。
Zend 框架
所有人都知道 Zend —— “PHP 公司”。當您下載和安裝 PHP 時,從大約 V3 開始,您就是在從 Zend 下載 PHP。除了發布 PHP 之外,Zend Technologies 多年來已經提供了大量 PHP 支持技術。Zend 提供適用于 PHP 的框架應當不稀奇 —— 這是一個到現在為止已經有兩百萬下載次數的流行框架。如果您老板聽說過 PHP 框架,那么很可能指的就是 Zend 框架。
symfony
由 Sensio 贊助的 symfony “旨在提高創建和維護 Web 應用程序的速度,以及用功能、控制和愉悅來替代重復性的編碼任務”。symfony 框架已經在世界各地的許多企業級應用程序中使用,其中可能包括最著名的 Askeet 和 Yahoo! 書簽。如果您認識的某個人安裝、使用或玩轉某個 PHP 框架,那么該框架很可能就是 symfony。
CakePHP
CakePHP 大部分源自 Ruby on Rails,它旨在把簡單性和可伸縮性引入到 PHP 框架中。CakePHP 一直被視為頂級 PHP 框架,并且 PHP V5 最近被選作 Mambo Content Management System 的核心。受強大的社區及快速增長的用戶庫推動,CakePHP 的受歡迎程度正在穩步增加。如果您曾聽到過關于 PHP 框架的討論,那么該討論可能就是關于 CakePHP 的。
![]() ![]() |
![]()
|
安裝
每個框架都有自己的一組安裝說明,并且完整的安裝細節超出本文的范圍。本文將重點說明這三個框架的安裝,突出每個單獨框架的安裝說明里可能未涉及的要點,或者需要有別于安裝說明的內容,因為將全部三個框架安裝到一臺計算機上十分特殊。
首先創建一個文件夾來保存所有代碼、框架并包括本系列需要的內容(例如,名為 /column 的目錄)。在此目錄中,創建四個附加目錄:htdocs、protected、include 和 src。編輯 Apache conf 文件,使文檔根目錄指向 /column/htdocs —— 然后當您處于該目錄中時(如果尚不在其中),應當啟用 mod_rewrite。編輯 php.ini conf 文件使 /column/include/ 目錄包含在 include_path 指令中。如果您還沒明白所有這些操作的意義,請不要著急。當您安裝框架時,一切都會變得清晰。
安裝 Zend 框架
下載 Zend 框架(請參閱 參考資料)。本系列使用的是 V1.0.1。下載并將 Zend 框架解壓縮到 /column/src 目錄中。該發行版將包含若干個文本文件和三個目錄:demos、tests 和 library。把庫目錄(這應當只是名為 Zend 的文件夾)的內容復制到 /column/include/ 目錄中。現在應當有包含若干個目錄和文件的名為 /column/include/Zend 的文件夾。這些是 Zend 框架所使用的庫。
好的!您已經安裝了 Zend 框架。
安裝 symfony
下載 symfony(請參閱 參考資料)。您可以通過下載頁面中列出的任意一種方法隨意安裝 symfony,但是出于我們的目的建議下載 tarball。將 tarball 解壓縮到 /column/src/symfony/ 目錄中。您應當會看到四個目錄(data、doc、lib 和 licenses),以及一些 README 文檔。對于安裝完成的應用程序來說,并不是所有的這些文檔和目錄都是必需的,但是現在,有這些文檔和目錄是可以的。對于安裝來說,看上去可能過于簡單。一定要記住,這些框架一般都是由實用程序和庫組成的,因此安裝框架并不難。使用框架需要執行一些追加配置。稍后您就將清楚如何配置。
安裝 CakePHP
下載 CakePHP(請參閱 參考資料)。本系列使用的是 1.2.0.5427alpha 版本。不管是不是成熟的 alpha 版本,CakePHP 的 1.2 分支已經成為 CakePHP 社區廣泛接受的標準。下載并解壓縮 tarball,將其內容放到 /column/src/cakephp 中。應當得到四個目錄(app、cake、doc 和 vendors)以及兩個文件(.htaccess 和 index.php)。稍后將對這些文件中的一些文件進行操作,不過現在這樣就可以了。
![]() ![]() |
![]()
|
測試應用程序
您已經下載并安裝了三個框架。但是您可能已經注意到自己尚未用這三個框架執行任何實際操作,例如用 Hello World 應用程序檢驗安裝。那是因為您要跳過 Hello World 并轉到較深入(但不會非常深入)的內容中。
在 PHP 框架中構建 Hello World 應用程序可能會有點痛苦。使用框架需要花費一定的系統開銷,并且該系統開銷發生在您嘗試創建諸如 Hello World 等簡單內容時。但是,在處理更復雜的應用程序時,同樣的系統開銷看上去則成為合理的支出。
您將構建的測試應用程序并不復雜。該測試應用程序將允許您使用文本區域把文本粘貼到應用程序中。該文本將被保存到數據庫中并在請求時由該應用程序檢索來顯示。使用這樣一個應用程序,您將可以輕松地創建和更新 Web 站點中的內容,而無需編輯 HTML 或上傳新文件。這種高度創新并使用新方法的應用程序將被稱為 Blahg。
Blahg 怎樣使用?
根據 Blahg 的描述,您可能已經推斷出如何設計應用程序需要考慮的幾個方面。Blahg 需要四個元素:
很明顯,Blahg 可以比現在更健壯,并且稍后在本系列中,您將執行一些增強工作。但是現在,滿足這些簡單要求就足夠。可惜的是,您現在還不能獲得在任意一個框架中構建 Blahg 的機會。那要在第 2 部分中進行。但是現在是設置您將使用的數據庫的最佳時機。
![]() ![]() |
![]()
|
設置數據庫
在可以實際構建 Blahg 之前,需要設置數據庫。并不是每個單獨框架都必須設置數據庫,但是出于本系列的學習目的,這樣做將使事情變得更有序,同時可以避免必需的表前綴。
創建三個名為 Zend、symfony 和 Cake 的數據庫,并將對每個數據庫的全部權限授權給相應的用戶。下面每個框架的指令都將包含創建 posts 表必需的 SQL。
擺弄數據庫的同時,您也可以創建 Blahg 將在開頭使用的表。使用以下 SQL 在 Zend 和 symfony 數據庫中創建 posts 表。
CREATE TABLE 'posts' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
'title' VARCHAR( 255 ) NOT NULL ,
'text' TEXT NOT NULL ,
'modified' TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE = MYISAM ;
|
對于 Zend 和 symfony,將把對修改后的列的維護工作留給數據庫。對于 CakePHP,將使用略有不同的 SQL。這樣做將使 Cake 為您變一些魔術(尤其是,CakePHP 將自動維護修改后的列)。
CREATE TABLE 'posts' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
'title' VARCHAR( 255 ) NOT NULL ,
'text' TEXT NOT NULL ,
'modified' DATETIME DEFAULT NULL
) ENGINE = MYISAM ;
|
這和使用表語法一樣簡單。根據這些表的外觀,您應當非常清楚 Blahg 的外觀及運行會是怎樣的。您甚至可能親自構建 Blahg。
![]() ![]() |
![]()
|
接下來的步驟
請忍住要立即投入并開始玩轉框架的誘惑。相反,花一些時間在不使用任何框架的情況下構建 Blahg。用您慣用的方法編寫一個應用程序,不用管那是一種什么樣的方法。構建 Blahg 時一定要遵守上面列出的要求 —— 仍然不要太有想象力。通過在框架上下文外部構建測試應用程序并修改應用程序以包括在本系列中構建的增強功能,您可以很好地衡量給定框架對需求和開發風格的滿足程度。
![]() ![]() |
![]()
|
結束語
到這里,我們已經打好了基礎。我希望您的安裝順利完成,但是如果遇到任何問題,則一定要研究每個單獨框架的安裝文檔(請參閱 參考資料)。請花一些時間根據以上指導信息構建 Blahg。這將是您值得花時間去做的事情。
參考資料
學習關于作者
![]() |
||
|
![]() |
Duane O'Brien 從 Oregon Trail 還只是文本的時候開始,就一直在技術方面游刃有余。他喜歡的食物是壽司。他還不曾去過月球。 |
上一篇 告別丑陋banner條,InMobi聯合開發者嘗試原生廣告
下一篇 java.lang.NoClassDefFoundError: com.doodlemobile.gamecenter.Platform