中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
《Zend Framework in Action》 《ZF實(shí)戰(zhàn)》 中文翻譯

第一章 Zend Framework介紹

PHP用來(lái)開(kāi)發(fā)動(dòng)態(tài)網(wǎng)頁(yè)已經(jīng)超過(guò)10年之久了。最初的PHP頁(yè)面都是用HTML里嵌套PHP代碼的形式寫成的。這種方式一開(kāi)始是很好的,因?yàn)樗粌H是即時(shí)響應(yīng)的并且對(duì)于簡(jiǎn)單腳本來(lái)說(shuō)它能展現(xiàn)所有需要的功能。PHP通過(guò)版本3和4流行了起來(lái),于是不可避免地將有越來(lái)越大的應(yīng)用程序由PHP寫成。很快人們便明顯意識(shí)到對(duì)于大型站點(diǎn)來(lái)說(shuō),這種相互混雜的PHP和HTML代碼編程模式不會(huì)是一種長(zhǎng)期解決辦法。
從日后的發(fā)展來(lái)看,最明顯的問(wèn)題是:可維護(hù)性和可擴(kuò)展性。雖然混雜的PHP和HTML開(kāi)發(fā)極其快速,但是從長(zhǎng)期來(lái)看,它很難進(jìn)行站點(diǎn)更新。一個(gè)真實(shí)嚴(yán)峻的事例表現(xiàn)在Web新聞方面,因?yàn)樗鼈冃枰?jīng)常改變其內(nèi)容和版面。大型站點(diǎn)一直都在改變,它們的外觀會(huì)定期的更新,新的內(nèi)容被添加,或者根據(jù)用戶或廣告商的需要重新分類,這些事總得有人去做!
Zend Framework被用來(lái)幫助人們確保在長(zhǎng)時(shí)間內(nèi),那些基于PHP編寫的站點(diǎn)的維護(hù)變得容易。它包括了豐富的可復(fù)用組件,從一整套MVC組件到PDF文檔生成器,可以說(shuō)是包羅萬(wàn)象。在本書中,我們將看到如何在真實(shí)的web環(huán)境中使用這些組件。

1.1 PHP站點(diǎn)的結(jié)構(gòu)設(shè)計(jì)

解決錯(cuò)綜復(fù)雜的PHP和HTML代碼的辦法是構(gòu)建結(jié)構(gòu)。最普遍的PHP結(jié)構(gòu)化程序的設(shè)計(jì)采納了“相關(guān)性分離”的概念,意思是用來(lái)執(zhí)行顯示功能的代碼不應(yīng)該如圖1.1一樣同執(zhí)行連接數(shù)據(jù)庫(kù)和獲取數(shù)據(jù)的代碼放在同一個(gè)文件中:


圖1-1 典型的PHP文件,PHP代碼和HTML按線性順序排列
對(duì)于大部分開(kāi)發(fā)者來(lái)說(shuō),設(shè)計(jì)站點(diǎn)代碼結(jié)構(gòu)的第一步是:復(fù)用性。一般這意味著連接數(shù)據(jù)庫(kù)的代碼被分離開(kāi)來(lái)放到一個(gè)譬如叫做db.inc.php的文件中,而將那些顯示通用的header和footer元素的代碼分離開(kāi)來(lái)做成模板看起來(lái)也是合乎邏輯的。函數(shù)被設(shè)計(jì)用來(lái)幫助解決全局變量相互影響的問(wèn)題。
隨著網(wǎng)站的壯大,功能類似的函數(shù)被分組進(jìn)入同一個(gè)類,使程序更容易地維護(hù)和添加新的功能。但這一階段只能持續(xù)很短的時(shí)間,因?yàn)槟愕木W(wǎng)站正在不斷地?cái)U(kuò)大,代碼變得如此龐大,直到有一天你的腦海里無(wú)法想象出代碼是如何工作的。
PHP程序員已經(jīng)習(xí)慣于站在巨人的肩膀上,因?yàn)槲覀兊恼Z(yǔ)言提供了許多容易的接口譬如GD圖像類,各種數(shù)據(jù)庫(kù)的連接類,甚至對(duì)于操作系統(tǒng)也提供了一些特別類,比如用來(lái)操作Windows上COM的類。面向?qū)ο蟮木幊趟枷胍膊豢杀苊獾剡M(jìn)入了PHP的視野,雖然當(dāng)初PHP4提供的類還只能比數(shù)組稍稍強(qiáng)大一些,但如今的PHP5已經(jīng)能支持所有你能在面向?qū)ο笳Z(yǔ)言中想象的到的功能,從此刻起,你使用的類成員(public,private和protected)將與interface,abstract這些關(guān)鍵字一起工作,而且支持異常處理。
對(duì)于面向?qū)ο髾C(jī)制的改進(jìn)使創(chuàng)建更復(fù)雜的類庫(kù)(被稱為框架)成為可能,例如Zend Framework支持一整套組織web應(yīng)用程序文件系統(tǒng)的機(jī)制,它是一種MVC設(shè)計(jì)模式。如下圖1-2所示:

圖1-2 典型的MVC架構(gòu)模式
用MVC原理設(shè)計(jì)的應(yīng)用程序會(huì)產(chǎn)生更多的文件,每一個(gè)文件各司其職,這使得維護(hù)變得容易許多。比方說(shuō),所有進(jìn)行數(shù)據(jù)庫(kù)查詢操作的代碼都存儲(chǔ)在同一種類里,它們通常被叫做Models,而HTML代碼的集合則被稱為View(可能會(huì)包含一些簡(jiǎn)單的PHP代碼),Controller文件調(diào)用Model,將數(shù)據(jù)反映在相對(duì)應(yīng)的View上,這樣便得到了想要的頁(yè)面。
Zend Framework并不是唯一一個(gè)使用MVC原理組織網(wǎng)站架構(gòu)的選擇,在PHP的世界里還有許多其它選擇,下面讓我們來(lái)看看Zend Framework所包含的東西以及為什么我們應(yīng)該考慮使用它。

1.2 為什么使用Zend Framework

當(dāng)你手中拿著這本書的時(shí)候,你可能很想知道為什么你要對(duì)Zend Framework感興趣,而不是其它的PHP框架。簡(jiǎn)而言之,Zend Framework提供了一套標(biāo)準(zhǔn)的組件集,幫助你方便地開(kāi)發(fā)web應(yīng)用程序。這些應(yīng)用程序能被輕松地開(kāi)發(fā)、維護(hù)和擴(kuò)展。
Zend Framework的主要特點(diǎn)是:

  • 包羅萬(wàn)象,功能全面
  • 現(xiàn)代設(shè)計(jì)理念
  • 易學(xué)
  • 完備的文檔
  • 易于開(kāi)發(fā)
  • 快速開(kāi)發(fā)

1.2.1 包羅萬(wàn)象,功能全面

Zend Framework是一個(gè)綜合性的大框架,包含了在開(kāi)發(fā)web應(yīng)用程序時(shí)所用到的各種工具,它包括一個(gè)健壯的MVC組件以確保網(wǎng)站架構(gòu)能按實(shí)際需求搭建。與此同時(shí),還有角色認(rèn)證,搜索,本地化,PDF文檔創(chuàng)建,email,web服務(wù)以及更多其它的神秘部件。如圖1-3所示:


圖1-3 Zend Framework被分為十個(gè)主要模塊
這并不是說(shuō)Zend Framework與其它的類庫(kù)不友好,恰恰相反,該框架的核心設(shè)計(jì)是,你可以只使用框架的一部分來(lái)編寫應(yīng)用程序,而應(yīng)用程序的其它部分可以使用諸如PEAR, Doctrine ORM或者Smarty模板類來(lái)完成。

1.2.2 現(xiàn)代設(shè)計(jì)理念

Zend Framework采用現(xiàn)代設(shè)計(jì)技術(shù)(也叫設(shè)計(jì)模式),用面向?qū)ο蟮腜HP5編寫。軟件設(shè)計(jì)模式是公認(rèn)的高層次設(shè)計(jì)問(wèn)題的解決方案,但它不是一個(gè)方案的具體實(shí)現(xiàn),具體實(shí)現(xiàn)取決于其他性質(zhì)的設(shè)計(jì)。 Zend Framework利用多種設(shè)計(jì)模式并且它的實(shí)現(xiàn)被精心設(shè)計(jì)以保證為開(kāi)發(fā)者提供最大的靈活性而不需要開(kāi)發(fā)者做很多的工作。
這個(gè)框架能識(shí)別出PHP方式,并且不強(qiáng)迫你使用所有的組件,所以你能自由地在它們之間進(jìn)行選擇。 這一點(diǎn)尤其重要,因?yàn)樗梢宰屇鶕?jù)已存在的頁(yè)面使用相應(yīng)的組件。關(guān)鍵在于,這個(gè)框架的任意一個(gè)組件都幾乎不依賴其它組件。

1.2.3 易學(xué)

如果你是像我這樣的一個(gè)普通人,那么學(xué)習(xí)如此龐大的代碼是多么的困難。幸運(yùn)的是,Zend Framework是模塊化的,它的設(shè)計(jì)目標(biāo)是簡(jiǎn)單,這幫助我們能循序漸進(jìn)地學(xué)習(xí)。每一個(gè)組件不依賴其它組件,因此,學(xué)習(xí)變得容易了。每一個(gè)組件的設(shè)計(jì)目的是,我們不需要明白組件在整個(gè)框架中是如何工作的,但卻可以使用它并從中受益。一旦你有了使用這些組件的一些經(jīng)驗(yàn),便會(huì)自然而然地開(kāi)始一步步使用它的一些高級(jí)特性,對(duì)于大部分用戶來(lái)說(shuō),這是減少入門障礙的關(guān)鍵。
比方說(shuō),配置組件Zend_Config被用來(lái)向配置文件提供接口,它提供了兩個(gè)高級(jí)特性:section overloading 和 nested keys,但是不需要為了使用而去理解它們的機(jī)制。一旦用戶有了一個(gè)Zend_Config的工作實(shí)踐,信心增加,使用高級(jí)特性便只是小事一樁。

1.2.4 完備的文檔

無(wú)論代碼寫的多么好,文檔的缺失會(huì)阻止一項(xiàng)工程獲得通過(guò)。Zend Framework的目標(biāo)瞄準(zhǔn)那些不愿意深入專研框架源代碼的開(kāi)發(fā)者們,于是它把文檔與代碼的重要性放在了同一水平上,這意味著Zend核心團(tuán)隊(duì)不允許沒(méi)有配套文檔的新代碼進(jìn)入框架。
該框架提供兩種類型的文檔:框架API版和最終用戶版。API文檔使用phpDocumentor創(chuàng)建,它在源代碼中自動(dòng)生成特殊的“docblock”注釋。這些注釋通常能在每個(gè)類、函數(shù)和變量聲明的開(kāi)頭找到。使用“docblock”的主要優(yōu)勢(shì)是在編碼的時(shí)候,一些集成開(kāi)發(fā)環(huán)境如PHPIDE in Eclipse或者Zend’s Studio可以提供自動(dòng)完成工具提示,提高了工作效率。
Zend Framework還提供手冊(cè)下載以及在線查詢。手冊(cè)提供了框架內(nèi)所有組件的細(xì)節(jié)并且指明了哪些功能是可用的,還給出例子幫助你開(kāi)始在程序中使用它們。更重要的是,對(duì)于更復(fù)雜的組件(如Zend_Controller),還給出了具體理論解釋,以便于你理解組件的工作原理。該文檔沒(méi)有道出如何搭配所有的組件來(lái)制作一個(gè)完整的應(yīng)用程序的過(guò)程,因此網(wǎng)絡(luò)社區(qū)出現(xiàn)了許多教程來(lái)幫助開(kāi)發(fā)者使用這個(gè)框架,它們被收集在framework’s wiki,網(wǎng)址是http://framework.zend.com/wiki/x/q。但這些教程點(diǎn)到為止,并不打算深入到每一個(gè)組件或者展示一些高級(jí)應(yīng)用,這也是這本書存在的原因。

1.2.5 易于開(kāi)發(fā)

我們注意到,PHP的一個(gè)長(zhǎng)處在于用它開(kāi)發(fā)簡(jiǎn)單動(dòng)態(tài)頁(yè)面是多么的容易,它使數(shù)百萬(wàn)人擁有了美妙的網(wǎng)站。PHP的一個(gè)能力是它的擁躉包括從編程初學(xué)者到需要加速工程進(jìn)度的企業(yè)級(jí)開(kāi)發(fā)員各類人群,Zend Framework的設(shè)計(jì)能降低各類人群的開(kāi)發(fā)難度。
那么,它是如何使開(kāi)發(fā)變得簡(jiǎn)單的呢?關(guān)鍵之處在于這個(gè)框架帶來(lái)的是已在各種易于發(fā)現(xiàn)錯(cuò)誤的調(diào)試代碼中經(jīng)測(cè)試而被證明是可靠的代碼,你只要寫你的應(yīng)用程序邏輯所需要的代碼,一些繁瑣的底層代碼已經(jīng)為你準(zhǔn)備好,這使得你的源碼顯得簡(jiǎn)潔整齊。

1.2.6 快速開(kāi)發(fā)

Zend Framework使web應(yīng)用程序更容易獲得持續(xù)性或者添加新功能到當(dāng)前站點(diǎn),因?yàn)樗鼮閼?yīng)用程序提供了最基本的組件,使開(kāi)發(fā)者可以專注于應(yīng)用程序的核心而不是那些最基礎(chǔ)的部分,所以很容易快速入門某一個(gè)組件并能立刻看到結(jié)果。
另一個(gè)提升開(kāi)發(fā)速度的地方在于該框架的組件所提供的默認(rèn)用法是最常用的用法,就是說(shuō),你不必?fù)?dān)心如何去為每個(gè)組件設(shè)置那龐大的配置參數(shù)而能直接使用它。例如,最簡(jiǎn)單的MVC引導(dǎo)程序只需以下幾段代碼:
require_once(’Zend/Loader.php’);
Zend_Loader::registerAuthoload();
Zend_Controller_Front::run(’/path/to/controllers’);
一旦啟動(dòng)并且運(yùn)行了以后,為應(yīng)用程序添加新頁(yè)面猶如為類添加一個(gè)新函數(shù)那么簡(jiǎn)單,只是另外需要一個(gè)放在正確目錄里的模板文件。同樣地,Zend_Session提供了眾多的可選參數(shù)來(lái)使它的表現(xiàn)符合你的想法,但其實(shí)大部分時(shí)候,沒(méi)有一個(gè)參數(shù)是需要你去設(shè)置的。

1.2.7 易于維護(hù)的結(jié)構(gòu)化代碼

正如我們?cè)缦人吹降?,結(jié)構(gòu)化應(yīng)用程序中不同職責(zé)的代碼被分離開(kāi)來(lái)。這也意味著尋找你所需要的代碼塊以及查找錯(cuò)誤變得容易許多。類似的,當(dāng)你要往顯示代碼中添加新特性的時(shí)候,所需要改變的是該顯示代碼所對(duì)應(yīng)的邏輯部分,這避免了因?yàn)闊o(wú)意中修改了其它東西而導(dǎo)致的BUG。Zend Framework鼓勵(lì)我們使用面向?qū)ο蟮木幊谭绞剑构こ谈菀拙S護(hù)。

1.3 Zend Framework是什么?

Zend Framework是一個(gè)用來(lái)建立PHP應(yīng)用程序的PHP類庫(kù)。它提供一系列組件來(lái)幫助開(kāi)發(fā)web應(yīng)用程序并使應(yīng)用程序在其生命周期內(nèi)更容易維護(hù)和擴(kuò)展。如此簡(jiǎn)單的描述不足以提供全面的信息,下面讓我們來(lái)看看Zend Framework是來(lái)自何處以及大致了解它包含哪些內(nèi)容。

1.3.1 它來(lái)自哪?

框架已出現(xiàn)多年,我在真實(shí)項(xiàng)目中所使用的第一個(gè)框架是Fusebox,它最初是為ColdFusion寫的。自那以后出現(xiàn)了許多種框架,伴隨而來(lái)的明星是用Java寫的Struts。大量的Struts的PHP克隆版本出現(xiàn)了,但是都沒(méi)有很好得翻譯成PHP,最大的差異在于Java web應(yīng)用程序運(yùn)行在持續(xù)運(yùn)轉(zhuǎn)的虛擬機(jī)上面,因此對(duì)于每一個(gè)頁(yè)面請(qǐng)求來(lái)說(shuō),程序的啟動(dòng)時(shí)間是不一樣的。PHP從零狀態(tài)開(kāi)始初始化,因此大量的Struts克隆的初始化使它們變得相對(duì)緩慢。近日,一個(gè)新的框架來(lái)到世上,它基于相對(duì)不知名的叫Ruby的編程語(yǔ)言。Rails(或者Ruby on Rails,就像大家所稱呼的)升華了配置的常規(guī)概念,在web開(kāi)發(fā)世界里引起了風(fēng)暴。在Rails出現(xiàn)后不久,大量的PHP版克隆,以及眾多的被Rails激發(fā)靈感而創(chuàng)造的框架,而不僅僅是一個(gè)Rails的PHP拷貝。
在2005年年末,Zend Technologies,一個(gè)專注于PHP的公司,開(kāi)始了它們的PHP協(xié)作工程來(lái)推動(dòng)PHP的使用比例。這個(gè)項(xiàng)目有三個(gè)方向:一個(gè)叫做PDT的eclipse IDE插件,Zend Framework和Zend Developer Zone website(Zend開(kāi)發(fā)者社區(qū)網(wǎng)站)。Zend Framework是一個(gè)制作PHP web開(kāi)發(fā)框架的開(kāi)源項(xiàng)目,寄期望于它能成為未來(lái)PHP應(yīng)用程序所基于的標(biāo)準(zhǔn)框架。

1.3.2 它有些什么?

Zend Framework中不同的組件被分組形成了若干個(gè)模塊,這一系列模塊構(gòu)成了框架。作為一個(gè)完整的框架,里面有你準(zhǔn)備建立企業(yè)Web應(yīng)用程序所需要的一切。但是系統(tǒng)是很靈活的,它的設(shè)計(jì)可以讓你自由選擇適合你的應(yīng)用程序當(dāng)前情況的組件。繼先前已在圖1-3中給出的組件之后,下面給出框架內(nèi)所有的組件,如圖1-4:


圖1-4:Zend Framework包含了大量的組件足以滿足企業(yè)級(jí)應(yīng)用
框架的每一模塊都包括許多組件,每一個(gè)組件又包括許多類,這些類我們將在后面的章節(jié)進(jìn)行講解。

核心組件

核心組件提供了一套功能全面的MVC系統(tǒng),以建立視圖與業(yè)務(wù)邏輯分離的應(yīng)用程序。三個(gè)主要的類家族組成了MVC系統(tǒng):Zend_Controller (Controller), Zend_View (View) 和Zend_Db(Model),如圖1-5顯示了基本的Zend Framework的MVC系統(tǒng):


圖1-5 Zend Framework方式的MVC
Zend_Controller類家族提供一個(gè)對(duì)controller行動(dòng)(亦稱命令)派遣請(qǐng)求的一個(gè)前面控制器設(shè)計(jì),以便集中所有處理。視圖模板被稱為Zend_View,它提供一個(gè)基于PHP的模板系統(tǒng)。第一章先翻譯到此,我發(fā)現(xiàn)作者很多廢話,感覺(jué)像是在賺稿費(fèi),因此我打算先翻譯第二章,實(shí)用萬(wàn)歲。

 

 

第二章 Hello Zend Framework!

 

在第二章,我們將看到一個(gè)輸出“Hello World!”的簡(jiǎn)單的Zend Framework應(yīng)用程序,對(duì)于普通的PHP應(yīng)用程序來(lái)講,源碼應(yīng)該像這樣,它只由一行代碼構(gòu)成:
echo ‘Hello World’;
Zend Framework需要更多的文件來(lái)創(chuàng)建一個(gè)基礎(chǔ)架構(gòu),因?yàn)橐粋€(gè)完整的網(wǎng)站是在此架構(gòu)上建立的。結(jié)果,我們的“Hello World!”程序的代碼也許看上去徒然地絮絮叨叨。我們也將考慮如何組織在硬盤上的站點(diǎn)文件來(lái)確保我們能找到我們所需的并來(lái)看看Zend Framework是如何為應(yīng)用程序設(shè)計(jì)一個(gè)MVC樣式的。下面讓我們先來(lái)看看所謂的Model-View-Controller是什么吧。

2.1 MVC設(shè)計(jì)樣式

為了理解Zend Framework應(yīng)用程序的工作流程,我有必要先講一點(diǎn)基礎(chǔ)理論。我們所創(chuàng)建的這些文件將關(guān)聯(lián)到許多框架類,因此我們得首先來(lái)學(xué)習(xí)Controller基礎(chǔ)。Zend Framework的控制器系統(tǒng)是MVC軟件設(shè)計(jì)模式的一個(gè)具體實(shí)現(xiàn),如圖2-1。軟件設(shè)計(jì)模式是一個(gè)通用問(wèn)題的標(biāo)準(zhǔn)解決方法,這表明具體的實(shí)現(xiàn)會(huì)有差異,但是解決同類問(wèn)題所采用的設(shè)計(jì)概念基本是一樣的。MVC模式描述了一種將應(yīng)用程序分離成三個(gè)部分的方式。


MVC設(shè)計(jì)模式圖展示了一個(gè)web應(yīng)用程序的三個(gè)主要部分以及一個(gè)分發(fā)器(dispatcher),它能找到處理相應(yīng)請(qǐng)求的控制器(controller)

2.1.1 模型(Model)

MVC模式的Model部分在幕后工作,跟專門的應(yīng)用有關(guān),被稱為商業(yè)邏輯,這部分代碼決定了如何向電子訂單添加運(yùn)費(fèi)數(shù)據(jù)或者如何取得某個(gè)客戶的名字和姓氏,因此檢索和存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù)是在模型層。Zend Framework利用Zend_Db_Table類來(lái)提供表級(jí)別的數(shù)據(jù)庫(kù)接入,并允許輕松操縱應(yīng)用程序所使用的數(shù)據(jù)。

2.1.2 視圖(View)

視圖是應(yīng)用程序的顯示邏輯部分,對(duì)于一個(gè)web應(yīng)用程序來(lái)說(shuō),它通常指的就是構(gòu)成頁(yè)面HTML代碼,當(dāng)然也可能包括其它的,比如XML,它被用來(lái)構(gòu)造RSS提要功能。另外,如果網(wǎng)站允許以CSV格式導(dǎo)出,導(dǎo)出的CSV將是視圖的一部分。視圖文件本身被稱為模板,因?yàn)樗鼈兺ǔS脕?lái)顯示由model創(chuàng)建的數(shù)據(jù)。通常把更復(fù)雜的模板代碼做成函數(shù),稱之為視圖助手(View Helper),視圖助手改進(jìn)了視圖代碼的復(fù)用性。默認(rèn)情況下, Zend框架的視圖類(Zend_View)使用PHP的模板文件,但其他模板引擎,如Smarty或PHPTAL也可取代之。

2.1.3 控制器(Controller)

上面兩種之外,應(yīng)用程序剩下的部分是控制器。對(duì)于web應(yīng)用程序來(lái)說(shuō),控制器決定如何處理web請(qǐng)求。Zend Framework中的控制器系統(tǒng)是基于前端控制器設(shè)計(jì)模式的,它利用句柄(Zend_Controller_Front)和動(dòng)作命令(Zend_Controller_Action)進(jìn)行協(xié)同工作。

2.2 剖析Zend Framework應(yīng)用程序

一個(gè)典型的Zend Framework應(yīng)用程序包含很多目錄,這是為了分離程序不同的組成部分,頂層文件系統(tǒng)結(jié)構(gòu)如圖2-2:


圖2-2 標(biāo)準(zhǔn)Zend Framework應(yīng)用程序的文件系統(tǒng)
一共有四個(gè)頂層目錄:
1. application
2. library
3. tests
4. web_root

2.2.1 application目錄

應(yīng)用程式目錄中包含所有該應(yīng)用程序運(yùn)行所需要的代碼,web服務(wù)器不能直接訪問(wèn)它。為了進(jìn)一步分離顯示、業(yè)務(wù)和控制邏輯,application目錄中包含了用于存放model, view和controller文件的次級(jí)目錄。根據(jù)需要,可能還會(huì)有其它的次級(jí)目錄,比如存放一個(gè)名叫settings.ini配置文件的config目錄。

2.2.2 library目錄

所有的應(yīng)用程序都使用類庫(kù),它是事先已經(jīng)寫好的可復(fù)用代碼。在一個(gè)Zend Framework應(yīng)用程序里,zend框架本身就存放在library文件夾中,其它的類庫(kù)或框架像是用戶自己編寫的框架,數(shù)據(jù)庫(kù)ORM類Propel,還有Smarty模板引擎等等也都存放于此。
類庫(kù)可存儲(chǔ)在任何應(yīng)用程序能找到的地方,無(wú)論是全局目錄還是本地目錄。全局目錄能被該服務(wù)器上的所有應(yīng)用程序訪問(wèn),例如/usr/php_include (對(duì)于Windows來(lái)說(shuō),可能是 c:codephp_include),我們可以使用php.ini配置文件中的include_path setting對(duì)路徑進(jìn)行默認(rèn)包含。另外,每個(gè)應(yīng)用程序可以在其自身目錄下存儲(chǔ)類文件,這種情況下,我們往往把類庫(kù)存放在一個(gè)叫l(wèi)ibrary的文件夾里,當(dāng)然有時(shí)也會(huì)命名為lib,include或者inc。

2.2.3 test目錄

test目錄用來(lái)存放所有的單元測(cè)試代碼。單元測(cè)試是用來(lái)幫助確保代碼在整個(gè)應(yīng)用程序生命周期中隨著它的增長(zhǎng)和變化而能繼續(xù)工作。隨著程序的壯大,先前編寫的代碼常常需要因?yàn)樾鹿δ艿募尤攵桓?稱為refactored)。在PHP的世界里,單元測(cè)試很少被認(rèn)為是重要的,但是如果你對(duì)自己的代碼進(jìn)行了單元測(cè)試的話,你會(huì)很感謝自己的。

2.2.4 web_root目錄

為了提高web程序的安全性,從服務(wù)器里應(yīng)該只能存取用戶可直接訪問(wèn)的文件。正如Zend Framework所使用的前端控制模式,所有的web請(qǐng)求都要從一個(gè)單一的文件通過(guò),這個(gè)文件通常是index.php,這個(gè)文件是唯一一個(gè)能讓用戶訪問(wèn)的php文件(譯者:也就是說(shuō)訪問(wèn)其它php文件的時(shí)候必定會(huì)事先訪問(wèn)index.php,這時(shí)會(huì)進(jìn)行一些預(yù)處理),因此它存放在web_root目錄下,其它的普通文件例如images,CSS和Javascript這些允許用戶直接訪問(wèn)的文件也在此處設(shè)立了自己的分目錄。

2.5 Hello World:File By File

(譯者:我不知道怎么直接跳到2.5節(jié)了,原書上是這樣的)
我們需要新建4個(gè)文件來(lái)創(chuàng)建我們那簡(jiǎn)單的Hello World應(yīng)用程序:一個(gè)啟動(dòng)文件(index.php),一個(gè)Apache配置文件,一個(gè)控制器(Controller)文件,一個(gè)視圖(View)模板,當(dāng)然Zend Framework類庫(kù)肯定已經(jīng)在library文件里頭了,最終程序會(huì)是這個(gè)樣子,如圖2-3:


一個(gè)最小化的Zend Framework應(yīng)用程序

2.5.1 啟動(dòng)(Bootstrapping)

啟動(dòng)是指開(kāi)始一個(gè)程序,在前端控制器模式中,這是唯一存在于根目錄的php文件,通常就是index.php。所有的web請(qǐng)求都將用到這個(gè)文件,因此它被用來(lái)設(shè)置整個(gè)應(yīng)用程序的環(huán)境,設(shè)置Zend Framework的控制器系統(tǒng),然后啟動(dòng)整個(gè)應(yīng)用程序。過(guò)程如代碼清單2-1所示:
Listing 2.1: web_root/index.php

 


error_reporting(E_ALL|E_STRICT); #1 設(shè)置錯(cuò)誤報(bào)告
ini_set(’display_errors’, true);
date_default_timezone_set(’Europe/London’);
$rootDir = dirname(dirname(__FILE__)); //index.php文件的上級(jí)目錄的上級(jí)目錄,在這個(gè)文件架構(gòu)中就是根目錄
set_include_path($rootDir . ‘/library’ #2 設(shè)置默認(rèn)的包含路徑,PATH_SEPARATOR是分隔符,若服務(wù)器操作系統(tǒng)為L(zhǎng)inux,它就是指’/',而在
. PATH_SEPARATOR . get_include_path()); #Windows系統(tǒng)中,它是指”,讀者可以自己試著輸出get_include_path(),看看能得到什么
require_once ‘Zend/Loader.php’;
Zend_Loader::loadClass(’Zend_Debug’);
Zend_Loader::loadClass(’Zend_Controller_Front’);
// 設(shè)置controller
$frontController = Zend_Controller_Front::getInstance(); #3 獲得Zend_Controller_Front實(shí)例
$frontController->throwExceptions(true); #4 拋出錯(cuò)誤信息,在正式產(chǎn)品中不要這么干
$frontController->setControllerDirectory(’../application/controllers’);
// 啟動(dòng)!
$frontController->dispatch();

讓我們來(lái)看看這個(gè)文件更多的細(xì)節(jié)。這個(gè)文件大部分的工作就是初始化。起初,設(shè)置錯(cuò)誤報(bào)告(#1) 以確保所有的錯(cuò)誤或警告能顯示。PHP5.1所采用的一套新的時(shí)間和日期函數(shù)需要知道我們處在世界的哪個(gè)時(shí)區(qū),有很多種方法來(lái)設(shè)置時(shí)區(qū),最簡(jiǎn)便的是使用date_default_timezone_set()函數(shù)。

 

在編寫Zend Framework應(yīng)用程序時(shí)我們要求library目錄被包含在php_include里,有好幾種方法來(lái)做這件事。若要在整個(gè)服務(wù)器范圍內(nèi)都能使用library目錄下的內(nèi)容,最快的方法是直接在Php.ini里修改include_path設(shè)置。一個(gè)更具有可移植性的方法是(特別是當(dāng)你在同一臺(tái)服務(wù)器里使用了多種版本的框架時(shí)),像上面那樣在啟動(dòng)文件里設(shè)置包含路徑(#2)。

Zend Framework應(yīng)用程序不依賴任何特殊的文件,然而事先裝載幾個(gè)幫助類還是很有用的。Zend_Loader::loadClass()是根據(jù)類的名字來(lái)包含正確的文件,它的功能是將類名中的下劃線轉(zhuǎn)化為目錄分隔符,經(jīng)過(guò)檢查發(fā)現(xiàn)沒(méi)有錯(cuò)誤后再包含這個(gè)文件。因此Zend_Loader::loadClass(’Zend_Controller_Front’); 和include_once ‘Zend/Controller/Front.php’;這兩行代碼將獲得相同的效果。Zend_Debug::dump()會(huì)以var_dump()格式輸出一段有關(guān)變量的調(diào)試信息。

Bootstrap的最后一部分設(shè)置前端控制器然后啟動(dòng)。前端控制器類Zend_Controller_Front實(shí)現(xiàn)了單入口設(shè)計(jì)模式(#3),類的定義本身意味著只能允許有一個(gè)實(shí)例對(duì)象。單入口設(shè)計(jì)模式適合前端控制的理由是他確??偸侵挥幸粋€(gè)類在處理請(qǐng)求,這種設(shè)計(jì)導(dǎo)致的一種結(jié)果是我們無(wú)法使用new操作符來(lái)創(chuàng)建一個(gè)新對(duì)象而必須使用getInstance()靜態(tài)成員函數(shù)。前端控制器有一個(gè)特點(diǎn)是他能捕捉所有默認(rèn)拋出(throw)的例外(exception)并把它們保存在由它創(chuàng)造的一個(gè)響應(yīng)對(duì)象(response object)中。這個(gè)響應(yīng)對(duì)象保存所有有關(guān)針對(duì)URL請(qǐng)求和HTML的響應(yīng)信息,它們是HTML頭信息,頁(yè)面內(nèi)容和任何被拋出的例外。當(dāng)處理完請(qǐng)求后,前端控制器自動(dòng)發(fā)送頭信息并且顯示頁(yè)面內(nèi)容。

在我們的Hello World應(yīng)用程序中,我將命令前端控制器拋出所有已發(fā)生的例外(#4)。對(duì)于剛接觸Zend Framework的新手來(lái)說(shuō),在響應(yīng)對(duì)象中存儲(chǔ)例外的默認(rèn)行為使人感到迷惑,因此我們把它關(guān)掉并且迫使錯(cuò)誤信息顯示出來(lái)。當(dāng)然了,在一個(gè)正式產(chǎn)品中,你絕對(duì)不可以把錯(cuò)誤顯示給用戶看,因此你應(yīng)該讓控制器捕捉錯(cuò)誤信息或者用try/catch塊包住index.php中的代碼。

我們調(diào)用前端控制器的dispatch()函數(shù)來(lái)啟動(dòng)應(yīng)用程序,這個(gè)函數(shù)將自動(dòng)創(chuàng)建一個(gè)請(qǐng)求和響應(yīng)對(duì)象來(lái)為我們encapsulate應(yīng)用程序的輸入輸出。然后它將創(chuàng)建一個(gè)路由器來(lái)獲得用戶請(qǐng)求的控制器和動(dòng)作,接著一個(gè)分發(fā)器對(duì)象載入正確的controller類和action成員函數(shù)來(lái)做”真正的”工作。

最后,正如我們上面所提到的,前段控制器把數(shù)據(jù)輸出到響應(yīng)對(duì)象于是一個(gè)web頁(yè)面呈現(xiàn)在大家面前了。

2.5.2 Apache .htaccess

為了保證除那些images,javascripts和CSS以外的web請(qǐng)求都能被引導(dǎo)至啟動(dòng)(bootstrap)文件,這里,我們會(huì)使用到Apache的mod_rewrite模塊。重寫規(guī)則能直接在Apache的httpd.conf文件中配置或者被存放在”web_root/”目錄下的一個(gè)叫.htaccess文件中進(jìn)行配置,代碼清單2-2所示的為.htaccess文件中的內(nèi)容:
Listing 2.2:web_root/.htaccess

 


# Rewrite rules for Zend Framework
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f #1
RewriteRule .* index.php #2
(注釋) <#1 Only continue if requested URL is not a file on disk.>
(注釋) <#2 Redirect request to index.php.>

幸運(yùn)的是,這個(gè)重寫規(guī)則并不是很復(fù)雜。上面的命令指示Apache把大部分的請(qǐng)求都路由至index.php來(lái)顯示相應(yīng)頁(yè)面,除非那些請(qǐng)求是映射到實(shí)際存在于web_root/目錄下的文件,如images,javascripts,CSS(都說(shuō)了幾遍了…)。

 

2.5.3 Index Controller

前端控制模式把URL請(qǐng)求映射到對(duì)應(yīng)類中對(duì)應(yīng)的成員函數(shù)(the action),這個(gè)過(guò)程叫做路由(routing)和分發(fā)(dispatching)。Controller類有嚴(yán)格的名字轉(zhuǎn)換規(guī)則來(lái)使分發(fā)器找到正確的成員函數(shù)??刂破黝愑袊?yán)格的命名規(guī)則,在此規(guī)則下,分發(fā)器能自動(dòng)找到正確的函數(shù)。比如,若路由想要自動(dòng)調(diào)用在{ControllerName}類里的{actionName}動(dòng)作,那么這個(gè)名叫{ControllerName}的類必須放在一個(gè)叫{ControllerName}.php的php文件里,如果請(qǐng)求中類和動(dòng)作都沒(méi)給出,那么將其默認(rèn)為index。因此,http://zfia.example.com/這樣一個(gè)請(qǐng)求將啟動(dòng)index控制器中的index動(dòng)作。類似的,
http://zfia.example.com/test這樣一個(gè)請(qǐng)求將觸發(fā)test控制器里的index動(dòng)作。我們以后會(huì)發(fā)現(xiàn),映射是很靈活的,盡管大多數(shù)時(shí)候我們采用的是常規(guī)手段。
在前端控制系統(tǒng)中,分發(fā)器期望在application/controllers目錄中找到名為IndexController.php的文件,這個(gè)文件必須包含一個(gè)叫做IndexController的類,并且至少、起碼要包含一個(gè)叫做indexAction()的函數(shù)。在我們的Hello World程序中,代碼清單2-3顯示了所必需的IndexController.php的內(nèi)容:
Listing 2.3: The index controller: application/controllers/IndexController.php

 


Zend::LoadClass(’Zend_View’);
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$ this->view->assign(’title’, ‘Hello World!’); #1
}
}
(注釋) <#1 把title屬性指配給視圖>

正如你所見(jiàn)到的,類IndexController是類Zend_Controller_Action的子類,它包括一個(gè)用來(lái)接入action函數(shù)的請(qǐng)求響應(yīng)對(duì)象。以及一些有用的helper函數(shù)來(lái)控制程序流程。我們這個(gè)簡(jiǎn)單程序里,indexAction()函數(shù)只需要給視圖屬性一個(gè)值,這個(gè)屬性是由名為ViewRenderer的一個(gè)動(dòng)作助手所提供的。
注意!
動(dòng)作助手是一個(gè)類,它提供了針對(duì)動(dòng)作的相關(guān)具體服務(wù)。

 

ViewRenderer動(dòng)作助手為我們展示了兩個(gè)有用的特性。首先,在動(dòng)作被調(diào)用之前,ViewRenderer創(chuàng)建一個(gè)Zend_View對(duì)象并把它設(shè)置為動(dòng)作的$view屬性,使我們能把值賦給視圖。其次,在我們的動(dòng)作結(jié)束后,它會(huì)把視圖模板賦給響應(yīng)對(duì)象,這將確保我們的控制器動(dòng)作函數(shù)可以集中在真正的工作上,而不是

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Groovy和Grails簡(jiǎn)介
python 項(xiàng)目代碼結(jié)構(gòu)
Zend Framework 入門
phpstorm下載-phpstorm官方版下載 PhpStorm2021軟件功能
用 Zend Studio 消滅 PHP 應(yīng)用程序中的 bug
PHP SPL,被遺落的寶石
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服