欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

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

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

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

第一章 Zend Framework介紹

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

1.1 PHP站點(diǎn)的結構設計

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


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

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

1.2 為什么使用Zend Framework

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

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

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

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


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

1.2.2 現代設計理念

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

1.2.3 易學(xué)

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

1.2.4 完備的文檔

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

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

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

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

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

1.2.7 易于維護的結構化代碼

正如我們早先所看到的,結構化應用程序中不同職責的代碼被分離開(kāi)來(lái)。這也意味著(zhù)尋找你所需要的代碼塊以及查找錯誤變得容易許多。類(lèi)似的,當你要往顯示代碼中添加新特性的時(shí)候,所需要改變的是該顯示代碼所對應的邏輯部分,這避免了因為無(wú)意中修改了其它東西而導致的BUG。Zend Framework鼓勵我們使用面向對象的編程方式,使工程更容易維護。

1.3 Zend Framework是什么?

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

1.3.1 它來(lái)自哪?

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

1.3.2 它有些什么?

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


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

核心組件

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


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

 

 

第二章 Hello Zend Framework!

 

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

2.1 MVC設計樣式

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


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

2.1.1 模型(Model)

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

2.1.2 視圖(View)

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

2.1.3 控制器(Controller)

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

2.2 剖析Zend Framework應用程序

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


圖2-2 標準Zend Framework應用程序的文件系統
一共有四個(gè)頂層目錄:
1. application
2. library
3. tests
4. web_root

2.2.1 application目錄

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

2.2.2 library目錄

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

2.2.3 test目錄

test目錄用來(lái)存放所有的單元測試代碼。單元測試是用來(lái)幫助確保代碼在整個(gè)應用程序生命周期中隨著(zhù)它的增長(cháng)和變化而能繼續工作。隨著(zhù)程序的壯大,先前編寫(xiě)的代碼常常需要因為新功能的加入而被更改(稱(chēng)為refactored)。在PHP的世界里,單元測試很少被認為是重要的,但是如果你對自己的代碼進(jìn)行了單元測試的話(huà),你會(huì )很感謝自己的。

2.2.4 web_root目錄

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

2.5 Hello World:File By File

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


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

2.5.1 啟動(dòng)(Bootstrapping)

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

 


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

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

 

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

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

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

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

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

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

2.5.2 Apache .htaccess

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

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

 

2.5.3 Index Controller

前端控制模式把URL請求映射到對應類(lèi)中對應的成員函數(the action),這個(gè)過(guò)程叫做路由(routing)和分發(fā)(dispatching)。Controller類(lèi)有嚴格的名字轉換規則來(lái)使分發(fā)器找到正確的成員函數??刂破黝?lèi)有嚴格的命名規則,在此規則下,分發(fā)器能自動(dòng)找到正確的函數。比如,若路由想要自動(dòng)調用在{ControllerName}類(lèi)里的{actionName}動(dòng)作,那么這個(gè)名叫{ControllerName}的類(lèi)必須放在一個(gè)叫{ControllerName}.php的php文件里,如果請求中類(lèi)和動(dòng)作都沒(méi)給出,那么將其默認為index。因此,http://zfia.example.com/這樣一個(gè)請求將啟動(dòng)index控制器中的index動(dòng)作。類(lèi)似的,
http://zfia.example.com/test這樣一個(gè)請求將觸發(fā)test控制器里的index動(dòng)作。我們以后會(huì )發(fā)現,映射是很靈活的,盡管大多數時(shí)候我們采用的是常規手段。
在前端控制系統中,分發(fā)器期望在application/controllers目錄中找到名為IndexController.php的文件,這個(gè)文件必須包含一個(gè)叫做IndexController的類(lèi),并且至少、起碼要包含一個(gè)叫做indexAction()的函數。在我們的Hello World程序中,代碼清單2-3顯示了所必需的IndexController.php的內容:
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)到的,類(lèi)IndexController是類(lèi)Zend_Controller_Action的子類(lèi),它包括一個(gè)用來(lái)接入action函數的請求響應對象。以及一些有用的helper函數來(lái)控制程序流程。我們這個(gè)簡(jiǎn)單程序里,indexAction()函數只需要給視圖屬性一個(gè)值,這個(gè)屬性是由名為ViewRenderer的一個(gè)動(dòng)作助手所提供的。
注意!
動(dòng)作助手是一個(gè)類(lèi),它提供了針對動(dòng)作的相關(guān)具體服務(wù)。

 

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

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

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久