在過去幾年中,框架迅速發展,幾乎在Web應用開發中,每一個人都會涉及到一個新生框架,Web開發框架會幫助你加快你的應用程序發佈,你只需迅速的把你的想法在框架的白板上書寫功能代碼。隨着Web應用的實現具備共同特徵,現有的框架方案已經知足這些要求,在今天還有什麼理由要從頭開始你的下一個Web應用呢?今天的Web開發,除程序自身語言外,一個現代化、靈活的和可擴展的框架,幾乎是一個相當重要的編程工具,此外,若是語言與框架兩個部份有特別的互補性,結果是將一個很是強大的工具包:Java和Spring, Ruby和Rails, C#和.NET, PHP和Yii。php
Yii是創始人薛強的心血結晶,於2008年1月1日開始開發。在此這前,薛強開發和維護PRADO框架多年。這些年的經驗和從PRADO項目獲得的用戶的反饋瞭解到,用戶須要一個更容易、可擴展、更快速的基於PHP5的框架,以知足應用程序開發人員不斷增加的需求。Yii正式發佈於2008年10月,最初是alpha版本,其與其餘基於PHP的框架表現相比使人印象深入,當即引發很是積極的關注。在2008年12月3日Yii1.0正式發佈, 並於2010年3月14日,發佈最新版本1.1.2。它有一個不斷增加的開發團隊,並繼續在天天PHP開發人員中獲得收益。咱們認爲,在這本書中包含信息會對你有些幫助,你很快就會明白爲何。數據庫
Yii的名稱(是一個縮寫,發音爲 Yee 或 [ji:])表明容易(easy),高效(effcient)和可擴展(extensible)。Yii是用PHP5寫的一個高性能,基於組件的Web 開發應用框架。Yii能夠更容易的建立和維護大規模的網絡應用程序。這也將使應用程序更有效和可擴展。讓咱們快速瞭解一下這些特性。編程
要運行基於Yii的Web應用,你須要它的核心框架和一臺支持PHP5.1.0以上的Web服務器,若是使用Yii開發,你須要精通PHP與面向對象編程 (OOP)。你不須要學習什麼新的配置和模板語言,創建Yii應用,主要包括編寫和維護本身定義的PHP類,其中一些將是繼承Yii核心框架組件類。設計模式
Yii集成了許多來自其餘著名的Web程序框架和應用程序中的偉大的想法,這些你可能會很熟悉並易於操做。瀏覽器
Yii還包含了一個易用的配置約定。這意味着,Yii已經爲幾乎全部的應用程序編寫了合理的默認值,若是你按照約定的規範,你會寫更少的代碼,花更少的時間來開發應用程序。若是須要Yii容許你在這些約定基礎之上進行定製,本章後面及整書,咱們將覆蓋到這些默認的約定。緩存
Yii是爲開發任何規模的Web應用提供的一個高性能的基於組件的Web框架,它鼓勵在Web程序中最大化的代碼重用,並可加快開發速度。如前所述,若是你堅持使用Yii的內置約定,你可讓您的應用在運行中,幾乎不須要任何配置手冊。性能優化
Yii的另外一個目的是幫助你使用DRY開發,DRY(Don't Repeat Yourself)是一種靈活的應用開發。全部Yii應用是使用模型-視圖-控制器(MVC)架構,Yii強制這種開發模式,經過提供一個放置你的MVC 代碼的位置,這最大限度地減小重複,並有助於代碼重用性和可維護性。你編寫越少的代碼,則須要的時間就越少,應用程序將贏得市場。一樣,越容易維護你的應用程序,留在市場的時間就越長。服務器
固然,Yii不只開發快,他的運行速度也是很是快的,性能是通過優化的。Yii從一開始就已經作到了開發與性能優化,其結果是,他是一個最快的PHP開發框架。Yii的開發團隊已經與其餘PHP框架進行了對比與測試,Yii運行速度在他們之上。這意味着在Yii上編寫應用程序增長額外的開銷是微不足道的。網絡
Yii是通過精心設計的,讓幾乎全部的代碼均可擴展和可定製,以知足不一樣任務須要。事實上,在開發Yii的應用時,很難用不到Yii擴展性,這是一個很主要的行爲,可擴展是框架的核心。若是你要將你的代碼爲做可重用的工具,提供給其餘開發者使用,Yii提供了簡單製做步驟和遵循準則,以幫助您創建這樣的第三方擴展。並容許你將他貢獻到Yii擴展列表中。架構
Yii最引人注目的是什麼。易用性、性能優越、可擴展。Yii的功能包會幫助你知足今天在Web應用程序上的那些更高要求。AJAX可用掛件,Web Service包,基於MVC結構的驗證,DAO和Active Record數據庫層,複雜的緩存,分級的角色訪問控制,主題化,國際化(I18N),和本地化(L10N),這僅僅是Yii的冰山一角。如今從1.1版本,核心框架中有一個官方擴展類庫叫Zii。這些擴展是由框架的核心團隊成員開發與維護。 社區用戶也能夠編寫並貢獻擴展,Yii的擴展天天都在增加,有關全部可用的用戶貢獻的擴展,詳見http://www.yiiframework.com/extensions/
如前所述,Yii是一個MVC框架,它提供了一個明確的目錄結構,模型,視圖,控制器的代碼分別放到本身的目錄,在咱們創建第一個Yii應用以前,咱們須要定義一些關鍵語,並查看Yii的MVC架構是若是實現和執行的。
一般在一個MVC架構中,模型是負責維護狀態,所以,它應該封裝業務規則,定義數據的狀態。在Yii中,一個模型能夠是 CModel的一個實例或它的子類。一般一個模型類包括數據的屬性,可能還會有不一樣的標籤(有些是爲了顯示給用戶時更友好),而且能夠設置一些規則進行驗證。模型中的數據可能來自數據庫的表或一個表單用戶輸入域。
Yii實現了兩種模型:表單模型(CFormModel類)和Active Record模型(CActiveRecord類)。他們都繼承自同一個基類CModel。CFormModel表明的數據模型是從HTML表單中收集的輸入,它封裝了全部邏輯,如表單的驗證和其餘業務邏輯,這些是要應用到表單的域上。它能將這些數據存儲在內存中,或者在一個Active Record的模型幫助下,存入數據庫。
Active Record (AR)是一種設計模式,用面向對象的方式抽象的訪問數據。在Yii中,每個AR對象的實例能夠是CActiveRecord類或它的子類,它包裝了數據庫表或視圖中的一行記錄,並封裝了全部邏輯和訪問數據庫的細節,若是有大部份的業務邏輯,則必須使用這種模型。數據庫表中一行每列字段的值對應AR對象的一個屬性。關於AR的更多介紹,後面將詳細說明。
一般狀況下,視圖是在數據模型的基礎上渲染用戶界面,Yii中一個視圖就是一個PHP文件,它包含有關用戶界面相關的元素,常用HTML,但也可使用PHP語句。一般在視圖中的PHP語句應該是很是簡單的條件或循環語句,或者使用Yii的UI組件,好比HTML助手的方法或預先創建好的掛件。更復雜的邏輯應該與視圖分離放到適當的模型中(如數據直接處理),或控制器中。
控制器主要是處理一個路由的請求,也負責得到用戶的輸入,與模型的交互,並指定視圖的顯示與更新。Yii中一個控制器實例多是CController類或它的子類。當一個控制器運行時,它會執行一個請求的操做,而後與須要的模型交互,最後渲染到一個視圖上。一個操做,最簡單的形式就是一個控制器類方法,方法的名字要以action開頭。
大多數的MVC實現中,Web請求生命週期一般以下步驟:
Yii 的MVC實現也不例外,在一個Yii應用程序中,從瀏覽器發送處理的請求,首先會傳給一個路由。路由分析請求,並肯定下一步的處理。在大多數狀況下路由會識別控制器中的特定操做方法。這個操做方法將關注傳入的請求數據與模型交互和執行其餘須要的業務邏輯,最終,這個操做方法將處理的響應數據發送給他對應的視圖類。視圖將確認符合預期佈局設計的數據,並返回到瀏覽器顯示。
爲了更好的理解,讓咱們看一個虛構的例子。假如咱們用Yii創建了本身的一個博客網站,域名是yourblog.com。這個網站與典型的博客網站相似。在首頁顯示最近發佈的文章列表。點擊每篇文章的標題,能夠顯示完整的文章。下面的圖片,能夠說明Yii是怎樣點擊標題,發送請求的。
這個圖片是跟蹤到用戶的點擊鏈接:
http://yourblog.com/post/show/id/99
首先,請求發送給路由。路由解析請求URL結構中的關鍵詞決定發送到哪。默認狀況下,Yii的URL結構如如下格式:
http://hostname/index.php?r=ControllerID/ActionID
URL中的變量r指的是路由,Yii分析路由這條路由,以肯定適當的控制器和操做方法作進一步處理請求。如今,你可能已經注意到,前面提到的URL地址並不遵循這個默認格式。其實這是一個很是簡單的事情,經過配置來使用更友好的格式:
http://hostname/ControllerID/ActionID
這個例子咱們將繼續使用這行簡化的格式。該URL中ControllerID指的是控制器的名稱。默認狀況下第一部份加上單詞Controller就是控制器類的名稱,例如:若是你的控制器類名是TestController則ControllerID應該是Test。一樣ActionID指的是控制器中定義的操做名稱。若是要在控制器中定義操做,那麼要將單詞Action加上操做名稱,例如:若是您的操做方法名爲actionCreate(),那麼 ActionID則是Create。
若是ActionID省略,控制器將採用默認的操做方法,這個方法是actionIndex()。若是ControllerID也省略了,應用程序將使用默認控制器。Yii默認的控制器是SiteController
回到這個例子,路由將分析下面的URL,http://yourblog.com/post/show/id/99,並會取URL路徑的第一部份做爲 ControllerID,第二部份做爲ActionID。這將轉化爲路由請求到PostController類中的 actionShow()方法。URL最後部份(id/99)是一個鍵/值的查詢參數,將在處理過程當中,提供給操做方法。在這個例子中,表示所選的博客文章ID爲99。
actionShow()方法處理具體的博客文章請求。在這種狀況下,它使用查詢字符串變量id,來肯定具體的要求,他將要求模型來查詢id=99的博客文章。
AR模型類請求數據庫返回數據給控制器,控制器進一步準備數據給視圖,視圖則渲染到一個須要的HTML中,並將響應返回給用戶的瀏覽器。
MVC架構容許咱們將模型,控制器與視圖分離,這使得開發人員能夠很容易改變應用程序,而不影響用戶界面(UI),UI設計師也能夠自由做出不影響模型的業務邏輯變化。這種分離也能夠很容易提供多個相同的模型。例如,你能夠在yourblog.com的HTML頁面或一個Flash/Flex RIA演示或移動應用程序或Web Service使用相同的模型代碼,使用MVC約定的分離功能,將使應用程序更容易擴展和維護。
Yii已經幫你作了不少,並非簡單的分離代碼,包括一些命令的約定和建議代碼應該放置在同一類目錄中。它已經幫助你寫好了須要將這些部份關聯在一塊兒的代碼。這使你能夠享受嚴格的MVC設計帶來的好處,而沒必要花費時間編寫本身所需細節代碼。讓咱們看看它都寫了些什麼。
在多數狀況下,咱們創建的Web應用程序內部會與數據庫關聯。如前面的博客發佈程序,該程序中博客的文章內容存在數據庫的表中。然而,Web應用程序須要的數據,與數據庫映射到內存中類定義的屬性是對應的。對象關係映射(ORM)庫提供的,就是映射數據庫表爲一個對象的類。
ORM的大部份代碼是如何實現數據庫表中的字段與對象之間的關係,這是很是繁瑣和重複的工做。幸運的是,Yii幫助大家完成了這些繁瑣而又乏味的工做,它提供給咱們一個ORM層,這就是AR模式。
正如前面提到的,AR是一種設計模型,用面向對象的方式抽象的訪問數據。它將表映射到類。行映射到對象,列則映射到對象的數據。換句話說,每個 Active Reocrd類的實例表明了數據庫表中的一行。然而,一個AR類不只僅是數據庫表中字段與類中屬性的映射關係,他還須要在這些數據上處理一些業務邏輯。最終這個類定義了全部關於怎樣對數據庫的讀寫操做。
依靠約定和合理的默認值,Yii的AR對象將減小開發的時間,沒必要花費時間在繁瑣和重複建立、讀取、更新和刪除數據的SQL語句上。它也容許開發人員使用面向對象的方式訪問更多的數據庫數據。爲了說明這一點,在博客系統中的示例代碼是用AR操做對應的數據庫表中的id,id是表的主鍵,id等於99。首先它會檢查主鍵,而後修改標題並將修改結果保存到數據庫:
$post=Post::model()->findByPk(99);
$post->title='Some new title';
$post->save();
Active Record完成了咱們之前須要編的任何SQL或其餘要處理數據庫的事情。
Active Record不僅作了這些。它還無縫的集成了許多Yii框架的其餘方面。有許多表單輸入域的HTML助手捆綁在AR類的屬性上。這樣,Active Record提取表單輸入值時直接進入模型。而且它支持自動化數據驗證,若是驗證失敗,Yii視圖類會顯示驗證錯誤給最終用戶。咱們將在本書提供的許多具體例子再次介紹AR。
視圖和控制器是很是緊密的兄弟。控制器會生成須要顯示的可用數據給視圖,視圖生成頁面,並觸發事件,發送數據給控制器。
在Yii中,一個視圖文件是由所屬的控制器類肯定是否渲染它。這樣,在視圖腳本里,咱們能夠經過簡單的方法$this引用到控制器實例。這樣的實現,使視圖和控制器更加緊密。幸運的是,Yii已經完成了全部的細節,所以,咱們能夠將精力集中具體應用程序的編碼上。
Yii的控制器不只僅是調用模型和渲染視圖。控制器能管理請求前或請求後的操做要求,實現基本的訪問控制規則來限制某些操做,管理應用程序範圍內的佈局和嵌套佈局,管理數據的分頁和許多幕後的服務。一樣,咱們要感謝Yii不須要讓咱們插手這些零亂工做的細節。
Yii還有不少內容,要探索它的奧祕,最好的方法是使用它。如今咱們已瞭解一些基礎概念和術語,這裏是咱們的第一個里程碑。在下一章,咱們將經過簡單的瞭解Yii的安裝過程和創建一個可運行的應用程序,以更好地說明。
在這一章中,咱們介紹了一個高級的Web應用框架Yii。咱們還了解了Yii的設計理念。初步討論這些抽象的內容,你是否失去了一點點信心呢?不要擔憂,這些例子都是有意義的,但,仍是要回顧一下這章具體包括的內容: