到這裏,大概的YII開發已經基本能夠,可是下面要將的全部課程,學完以後可讓你更愛YII。下面的教程是講的MVC的M,model。數據,業務,代碼的集中地區。因此開始以前,學學開發規範-路徑別名-命名空間-,來寫出本身愛看,別人能看的代碼。開發規範對於一個php開發這來講仍是很無奈的。這裏很少說了,規則不是我定的,個人目的就是在這裏羅列一點,來講說什麼是規範。儘管我寫的代碼只有我本身愛看。php
YII官方給出了四篇文檔來講明:html
路徑別名、名字空間:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.namespacejava
開發規範:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.conventionweb
開發流程:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.workflow數據庫
最佳MVC實踐:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.best-practices編程
這四個文檔誰然描述的內容不多。可是全部要說明的大致都講了一下。下面做一些簡單的排列組合。api
/////////////////////////////////////////////////////////////////////////// 數組
Yii 中普遍的使用了路徑別名。路徑別名關聯於一個目錄或文件的路徑。它以點號語法指定,相似於普遍使用的名字空間(namespace)格式:緩存
RootAlias.path.to.target
其中的 RootAlias
是某個現存目錄的別名。安全
爲方便起見,Yii 預約義瞭如下幾個根別名:
system
: 表示 Yii 框架目錄;zii
: 表示 Zii 庫 目錄;application
: 表示應用的 基礎目錄;webroot
: 表示 入口腳本 文件所在的目錄。此別名從版本 1.0.3 開始有效。ext
: 表示包含了全部第三方 擴展 的目錄。此別名從版本 1.0.8 開始有效。額外的,若是應用使用了 模塊, (Yii) 也爲每一個模塊ID定義了根別名,指向相應模塊的跟目錄。 此功能從版本 1.0.3 起有效。
經過使用 YiiBase::getPathOfAlias(), 別名能夠被翻譯爲其相應的路徑。 例如, system.web.CController
會被翻譯爲 yii/framework/web/CController
。
使用別名能夠很方便的導入類的定義。 例如,若是咱們想包含 CController 類的定義,咱們能夠調用以下代碼
Yii::import('system.web.CController');
import 方法跟 include
和 require
不一樣,它更加高效。 導入(import)的類定義並不會真正被包含進來,直到它第一次被引用。 屢次導入一樣的名字空間也會比 include_once
和 require_once
快得多。
提示: 當引用 Yii 框架定義的類時,咱們不須要導入或包含它。全部的核心 Yii 類都已被提早導入了。
從1.1.5版本開始,Yii容許用戶定義的類經過使Class Map機制來預先導入,這也是Yii內置類使用的方法。 預先引入機制能夠在Yii應用的任何地方使用,無需顯式地導入或者包含文件。這個特性對於一個創建在Yii基礎上的框架或者類庫來講頗有用。
若要使用預導入功能,要在CWebApplication::run()執行前執行下面的代碼:
Yii::$classMap=array( 'ClassName1' => 'path/to/ClassName1.php', 'ClassName2' => 'path/to/ClassName2.php', ...... );
咱們還可使用以下語法導入整個目錄,這樣此目錄下的類文件就會在須要時被自動包含。
Yii::import('system.web.*');
除 import 外, 別名還在其餘許多地方指向類。 例如,路徑別名能夠傳遞給 Yii::createComponent() 以建立相應類的實例。 即便類文件在以前從未被包含。
不要將路徑別名和名字空間混淆了,名字空間是指對一些類名的一個邏輯組合,這樣它們就能夠相互區分開,即便有相同的名字。 而路徑別名是用於指向一個類文件或目錄。路徑別名與名字空間並不衝突。
提示: 因爲 5.3.0 版本以前的 PHP 本質上不支持名字空間,你沒法建立兩個具備相同名字但不一樣定義的類的實例。 鑑於此,全部的 Yii 框架類都以字母 'C'(意爲 'Class') 做前綴,這樣它們能夠區分於用戶定義的類。咱們建議前綴 'C' 只保留給 Yii 框架使用,用戶定義的類則使用其餘的字母做前綴。
使用命名空間的類是指一個在非全局命名空間下聲明的類。好比說,類application\components\GoogleMap
在命名空間application\components
下的類。使用命名空間須要 PHP 5.3.0 或者以上版本。
從1.1.5開始,能夠無需顯式引入而使用一個包含命名空間的類。好比說,咱們能夠建立一個application\components\GoogleMap
的實例而無需去處理引入的路徑,這樣就加強了Yii的自動導入機制。
若要自動導入使用命名空間的類,命名空間的格式必須和路徑別名類似。好比說,類application\components\GoogleMap
所對應的路徑必須和別名application.components.GoogleMap
一致。
////////////////////////////////////////////////////////////////////////////////////////////////
路徑別名的和命名空間的總結
若是php對這方面作的和java同樣好,估計yii框架就不會這麼麻煩的定義這兩個東西了。因此YII定義這兩個東西其實主要是爲了彌補php的這方面的不足。
1.命名空間和路徑別名的區別
名字空間是指對一些類名的一個邏輯組合,這樣它們就能夠相互區分開,即便有相同的名字。
路徑別名是用於指向一個類文件或目錄。
2.記住YII提供的幾個yii框架本身的路徑別名,由於之後會經常用到。system zii application webroot ext
3.路徑別名的定義
// define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
//get
// Yii::getPathOfAlias('local');
4.路徑別名的使用YII提供的require、include方法,是用函數Yii::import();
一種是導入一個類
Yii::import('system.web.CController');
一種是導入某個目錄下的全部類
Yii::import('system.web.*');
5.至於命名空間,須要5.3以上的PHP支持,目前不推薦使用。
///////////////////////////////////////////////////////////////////////
Yii 偏心規範勝於配置。遵循規範可以使你可以建立成熟的Yii應用而不須要編寫、維護複雜的配置。 固然了,在必要時,Yii 仍然能夠在幾乎全部的方面經過配置實現自定義。
下面咱們講解 Yii 編程中推薦的開發規範。 爲簡單起見,咱們假設WebRoot
是 Yii 應用安裝的目錄。
默認狀況下,Yii 識別以下格式的 URL:
http://hostname/index.php?r=ControllerID/ActionID
GET 變量意爲 路由(route) ,它能夠被Yii解析爲 控制器和動做。 若是 ActionID
被省略,控制器將使用默認的動做(在CController::defaultAction中定義); 若是 ControllerID
也被省略(或者 r
變量不存在),應用將使用默認的控制器 (在CWebApplication::defaultController中定義)。
經過 CUrlManager 的幫助,能夠建立更加可識別,更加 SEO 友好的 URL,例如http://hostname/ControllerID/ActionID.html
。此功能在 URL Management 中有詳細講解。
Yii 推薦命名變量、函數和類時使用 駝峯風格,即每一個單詞的首字母大寫並連在一塊兒,中間無空格。 變量名和函數名應該使它們的第一個單詞所有小寫,以使其區別於類名(例如:$basePath
, runController()
,LinkPager
)。
對私有類成員變量來講,咱們推薦如下劃線做爲其名字前綴(例如: $_actionList
)。
因爲在 PHP 5.3.0 以前不支持名字空間,咱們推薦類要經過某種獨立的方式命名,以免和第三方類發生衝突。鑑於此, 全部的 Yii 框架類名以 "C" 做前綴。
一個針對控制器名字的特殊規則是它們必須以單詞 Controller
結尾。那麼控制器 ID 即類名的首字母小寫並去掉單詞 Controller
。 例如,PageController
類的 ID 就是 page
。這個規則使應用更加安全。它還使控制器相關的URL更加簡單(例如 /index.php?r=page/index
而不是 /index.php?r=PageController/index
)。
配置是一個鍵值對數組。每一個鍵表明了所配置的對象中的屬性名,每一個值則爲相應屬性的初始值。 例如,array('name'=>'My application', 'basePath'=>'./protected')
初始化了 name
和 basePath
屬性爲它們相應的數組值。
類中任何可寫的屬性均可以被配置。若是沒有配置,屬性將使用它們的默認值。 當配置一個屬性時,最好閱讀相應文檔以保證初始值正確。
命名和使用文件的規範取決於它們的類型。
類文件應以它們包含的公有類命名。例如, CController 類位於 CController.php
文件中。
公有類是能夠被任何其餘類使用的類。每一個類文件應包含最多一個公有類。
私有類(只能被一個公有類使用的類)能夠放在使用此類的公有類所在的文件中。
視圖文件應以視圖的名字命名。例如, index
視圖位於 index.php
文件中。 視圖文件是一個PHP腳本文件,它包含了用於呈現內容的 HTML和PHP代碼。
配置文件能夠任意命名。 配置文件是一個PHP腳本,它的主要目的是返回一個體現配置的關聯數組。
Yii 假定了一系列默認的目錄用於不一樣的場合。若是須要,每一個目錄均可以自定義。
WebRoot/protected
: 這是 應用基礎目錄, 是放置全部安全敏感的PHP腳本和數據文件的地方。Yii 有一個默認的 application
別名指向此目錄。 此目錄及目錄中的文件應該保護起來防止Web用戶訪問。它能夠經過 CWebApplication::basePath 自定義。
WebRoot/protected/runtime
: 此目錄放置應用在運行時產生的私有臨時文件。 此目錄必須對 Web 服務器進程可寫。它能夠經過 CApplication::runtimePath自定義。
WebRoot/protected/extensions
: 此目錄放置全部第三方擴展。 它能夠經過 CApplication::extensionPath自定義。
WebRoot/protected/modules
: 此目錄放置全部的應用 模塊,每一個模塊使用一個子目錄。
WebRoot/protected/controllers
: 此目錄放置全部控制器類文件。 它能夠經過CWebApplication::controllerPath 自定義。
WebRoot/protected/views
: 此目錄放置全部試圖文件, 包含控制器視圖,佈局視圖和系統視圖。 它能夠經過 CWebApplication::viewPath 自定義。
WebRoot/protected/views/ControllerID
: 此目錄放置單個控制器類中使用的視圖文件。 此處的ControllerID
是指控制器的 ID 。它能夠經過 CController::viewPath 自定義。
WebRoot/protected/views/layouts
: 此目錄放置全部佈局視圖文件。它能夠經過CWebApplication::layoutPath 自定義。
WebRoot/protected/views/system
: 此目錄放置全部系統視圖文件。 系統視圖文件是用於顯示異常和錯誤的模板。它能夠通
WebRoot/assets
: 此目錄放置公共資源文件。 資源文件是能夠被髮布的,可由Web用戶訪問的私有文件。此目錄必須對 Web 服務器進程可寫。 它能夠經過 CAssetManager::basePath 自定義
WebRoot/themes
: 此目錄放置應用使用的不一樣的主題。每一個子目錄即一個主題,主題的名字即目錄的名字。 它能夠經過 CThemeManager::basePath 自定義。
多數Web 應用是由數據庫驅動的。爲了最佳時間,咱們 推薦在對錶和列命名時使用以下命名規範。注意,這些規範並非 Yii 所必須的。
數據庫表名和列名都使用小寫命名。
名字中的單詞應使用下劃線分割 (例如 product_order
)。
對於表名,你既可使用單數也可使用複數。但 不要 同時使用二者。爲簡單起見,咱們推薦使用單數名字。
表名可使用一個通用前綴,例如 tbl_
。這樣當應用所使用的表和另外一個應用說使用的表共存於同一個數據庫中時就特別有用。 這兩個應用的表能夠經過使用不一樣的表前綴很容易地區別開。
////////////////////////////////////////////////////////////////////////////////////
開發規範 總結紅色標記
/////////////////////////////////////////////////////////////////////////////
介紹過 Yii 中的基本概念以後,咱們如今講解使用 Yii 開發Web應用時的通常開發流程。 此處的開發流程假設咱們已經完成了對應用的需求分析和必要的設計分析。
建立目錄結構骨架。建立第一個Web應用 中講到的 yiic
工具能夠快速實現此步驟。
配置此 應用。這是經過修改應用配置文件實現的。 此步驟可能也須要編寫一些應用組件(例如用戶組件)。
爲所管理的每一個類型的數據建立一個 模型 類。 Creating First Yii Application 和 Automatic Code Generation中講述的 Gii
工具能夠用於快速爲每一個數據表建立 active record 類。
4.爲每一個類型的用戶請求 建立一個 控制器 類。 具體如何對用戶請求歸類要看實際需求。整體來講,若是一個模型類須要被用戶訪問,他就應該有一個相應的控制器類。 Gii
工具也能夠自動實現這一步驟。
在控制器類中配置必要的動做 過濾器。
若是須要主題功能,建立 主題 。
若是須要 國際化(I18N) ,建立翻譯信息。
對可緩存的數據點和視圖點應用適當的 緩存 技術。
最終 調整 與部署。
上述的每一個步驟中,可能須要建立並執行測試用例。
///////////////////////////////////////////////////////////////////////////////