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