有了前面的“Hello,World”, Yii 應(yīng)用開(kāi)發(fā)似乎很容易,別這么快下結(jié)論:-),想起多年以前剛開(kāi)始使用 MFC 開(kāi)發(fā)時(shí),寫(xiě)完第一個(gè) Hello,World 之后,還是覺(jué)得無(wú)從下手,不知道怎么開(kāi)始寫(xiě) MFC 應(yīng)用,這是因?yàn)?MFC 提供了大量的類(lèi)庫(kù),如果對(duì) MFC 應(yīng)用程序框架和其提供的主要類(lèi)庫(kù)不事先了解的話(huà),基本上就沒(méi)辦法寫(xiě)應(yīng)用,學(xué)習(xí) Yii Framework,也要先了解一下組成 Yii 應(yīng)用的幾個(gè)主要組成部分也一些常用的類(lèi)。
在前面教程說(shuō)過(guò) Yii 采用 MVC(模型-視圖-控制器),并介紹了入口腳本和主應(yīng)用程序類(lèi) CWebApplication 類(lèi)。應(yīng)用類(lèi)的實(shí)例由 入口腳本 創(chuàng)建為一個(gè)對(duì)象(Singleton)。這個(gè)應(yīng)用單例對(duì)象可以在任何地方通過(guò) Yii::app() 訪(fǎng)問(wèn)。
默認(rèn)情況下,應(yīng)用是一個(gè) CWebApplication 的實(shí)例。要自定義它,我們通常需要提供一個(gè)配置文件 (或數(shù)組) 以創(chuàng)建應(yīng)用實(shí)例時(shí)初始化其屬性值。自定義應(yīng)用的另一種方式是繼承 CWebApplication。
配置是一個(gè)鍵值對(duì)數(shù)組。每個(gè)鍵代表應(yīng)用實(shí)例中某屬性的名字,每個(gè)值即相應(yīng)屬性的初始值。 例如,如下的配置設(shè)定了應(yīng)用的 name 和 defaultController 屬性。
array(
'name'=>'Yii Framework',
'defaultController'=>'site',
)
我們通常在一個(gè)單獨(dú)的 PHP 腳本(e.g.protected/config/main.php)中保存這些配置。在腳本中, 我們通過(guò)以下方式返回此配置數(shù)組:
return array(...);
要應(yīng)用此配置,我們將配置文件的名字作為參數(shù)傳遞給應(yīng)用的構(gòu)造器,或像下面這樣傳遞到 Yii::createWebApplication() 。這通常在 入口腳本 中完成:
$app=Yii::createWebApplication($configFile);
應(yīng)用的功能可以通過(guò)其靈活的組件結(jié)構(gòu)輕易地自定義或增強(qiáng)。應(yīng)用管理了一系列應(yīng)用組件,每個(gè)組件實(shí)現(xiàn)一特定功能。 例如,應(yīng)用通過(guò) CUrlManager 和 CHttpRequest 的幫助解析來(lái)自用戶(hù)的請(qǐng)求。
通過(guò)配置應(yīng)用的 components 屬性, 我們可以自定義應(yīng)用中用到的任何組件類(lèi)及其屬性值。例如,我們可以配置應(yīng)用的 CMemCache 組件, 這樣它就可以使用多個(gè) memcache 服務(wù)器實(shí)現(xiàn)緩存:
array(
......
'components'=>array(
......
'cache'=>array(
'class'=>'CMemCache',
'servers'=>array(
array('host'=>'server1', 'port'=>11211, 'weight'=>60),
array('host'=>'server2', 'port'=>11211, 'weight'=>40),
),
),
),
)
如上所示,我們?cè)?components 數(shù)組中添加了 cache 元素。cache 元素表明此組件的類(lèi)是 CMemCache, 他的 servers 屬性應(yīng)依此初始化。
要訪(fǎng)問(wèn)一個(gè)應(yīng)用組件,使用 Yii::app()->ComponentID ,其中的 ComponentID 是指組件的 ID(例如 Yii::app()->cache)。
應(yīng)用的組件可以通過(guò)在其配置中設(shè)置 enabled 為 false 禁用。當(dāng)我們?cè)L問(wèn)被禁用的組件時(shí)將返回 Null。
當(dāng)處理用戶(hù)請(qǐng)求時(shí),應(yīng)用將經(jīng)歷如下聲明周期:
控制器 是 CController 或其子類(lèi)的實(shí)例。它在當(dāng)用戶(hù)請(qǐng)求時(shí)由應(yīng)用創(chuàng)建。 當(dāng)一個(gè)控制器運(yùn)行時(shí),它執(zhí)行所請(qǐng)求的動(dòng)作,動(dòng)作通常會(huì)引入所必要的模型并渲染相應(yīng)的視圖。 動(dòng)作的最簡(jiǎn)形式,就是一個(gè)名字以 action 開(kāi)頭的控制器類(lèi)方法。
控制器通常有一個(gè)默認(rèn)的動(dòng)作。當(dāng)用戶(hù)的請(qǐng)求未指定要執(zhí)行的動(dòng)作時(shí),默認(rèn)動(dòng)作將被執(zhí)行。 默認(rèn)情況下,默認(rèn)的動(dòng)作名為 index。它可以通過(guò)設(shè)置 CController::defaultAction 修改。
如下是一個(gè)控制器類(lèi)所需的最簡(jiǎn)代碼。由于此控制器未定義任何動(dòng)作,對(duì)它的請(qǐng)求將拋出一個(gè)異常。
class SiteController extends CController
{
}
用戶(hù)訪(fǎng)問(wèn)網(wǎng)頁(yè)的 URL 的基本格式為 /index.php?r=XController/YAction , 對(duì)應(yīng)到代碼為 protected 目錄下 controllers 子目錄下的 XController.php 中定義的的類(lèi) XController 的 YAction 方法。 例如,路由 post/edit 代表 PostController 及其 edit 動(dòng)作。默認(rèn)情況下,URL http://hostname/index.php?r=post/edit 即請(qǐng)求此控制器和動(dòng)作。 模型(CModel類(lèi)) 模型是 CModel 或其子類(lèi)的實(shí)例。模型用于保持?jǐn)?shù)據(jù)以及與其相關(guān)的業(yè)務(wù)邏輯.
Yii 實(shí)現(xiàn)了兩種類(lèi)型的模型:表單模型和 Active Record。二者均繼承于相同的基類(lèi) CModel。
表單模型是 CFormModel 的實(shí)例。表單模型用于保持從用戶(hù)的輸入獲取的數(shù)據(jù)。 這些數(shù)據(jù)經(jīng)常被獲取,使用,然后丟棄。例如,在一個(gè)登錄頁(yè)面中, 我們可以使用表單模型用于表示由最終用戶(hù)提供的用戶(hù)名和密碼信息。更多詳情,請(qǐng)參考 使用表單。
Active Record (AR) 是一種用于通過(guò)面向?qū)ο蟮娘L(fēng)格抽象化數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的設(shè)計(jì)模式。 每個(gè) AR 對(duì)象是一個(gè) CActiveRecord 或其子類(lèi)的實(shí)例。代表數(shù)據(jù)表中的一行。 行中的字段對(duì)應(yīng) AR 對(duì)象中的屬性。
視圖是一個(gè)包含了主要的用戶(hù)交互元素的 PHP 腳本.他可以包含 PHP 語(yǔ)句,但是我們建議這些語(yǔ)句不要去改變數(shù)據(jù)模型,且最好能夠保持其單純性(單純作為視圖)。為了實(shí)現(xiàn)邏輯和界面分離,大段的邏輯應(yīng)該被放置于控制器或模型中,而不是視圖中。
和 Windows 應(yīng)用類(lèi)比的話(huà),View 類(lèi)似于 Windows 應(yīng)用的 Form 類(lèi),其中使用可以控件來(lái)定義 UI,控件對(duì)應(yīng)到 Yii 框架成為 CWidget,它是一個(gè)主要用于表現(xiàn)數(shù)據(jù)的組件.小物件通常內(nèi)嵌于一個(gè)視圖來(lái)產(chǎn)生一些復(fù)雜而獨(dú)立的用戶(hù)界面.例如,一個(gè)日歷小物件可用于渲染一個(gè)復(fù)雜的日歷界面.小物件使用戶(hù)界面更加可復(fù)用.
和 Asp.Net 類(lèi)似的 Masterpage,Yii 中稱(chēng)為 Layout(布局)。
布局是一種用來(lái)修飾視圖的特殊的視圖文件.它通常包含了用戶(hù)界面中通用的一部分視圖.例如:布局可以包含 header 和 footer 的部分,然后把內(nèi)容嵌入其間.
......header here......
<?php echo $content; ?>
......footer here......
其中的 $content 則儲(chǔ)存了內(nèi)容視圖的渲染結(jié)果.
當(dāng)使用 render() 時(shí),布局被隱式應(yīng)用.視圖腳本 protected/views/layouts/main.php 是默認(rèn)的布局文件.這可以通過(guò)改變 CWebApplication::layout 或者 CWebApplication::layout 進(jìn)行自定義。要渲染一個(gè)不帶布局的視圖,則需調(diào)用 renderPartial() 。
以上介紹了 Yii 應(yīng)用的幾個(gè)重要的組成部分,可以參考“Hello,World”示例,并且 Yii 應(yīng)用的文件結(jié)構(gòu)也有缺省的定義,下面為應(yīng)用的缺省目錄結(jié)構(gòu):
index.php Web 應(yīng)用入口腳本文件
index-test.php 功能測(cè)試使用的入口腳本文件
assets/ 包含公開(kāi)的資源文件
css/ 包含 CSS 文件
images/ 包含圖片文件
themes/ 包含應(yīng)用主題
protected/ 包含受保護(hù)的應(yīng)用文件
yiic yiic 命令行腳本
yiic.bat Windows 下的 yiic 命令行腳本
yiic.php yiic 命令行 PHP 腳本
commands/ 包含自定義的 ‘yiic’ 命令
shell/ 包含自定義的 ‘yiic shell’ 命令
components/ 包含可重用的用戶(hù)組件
Controller.php 所有控制器類(lèi)的基礎(chǔ)類(lèi)
Identity.php 用來(lái)認(rèn)證的 ‘Identity’ 類(lèi)
config/ 包含配置文件
console.php 控制臺(tái)應(yīng)用配置
main.php Web 應(yīng)用配置
test.php 功能測(cè)試使用的配置
controllers/ 包含控制器的類(lèi)文件
SiteController.php 默認(rèn)控制器的類(lèi)文件
data/ 包含示例數(shù)據(jù)庫(kù)
schema.mysql.sql 示例 MySQL 數(shù)據(jù)庫(kù)
schema.sqlite.sql 示例 SQLite 數(shù)據(jù)庫(kù)
testdrive.db 示例 SQLite 數(shù)據(jù)庫(kù)文件
extensions/ 包含第三方擴(kuò)展
messages/ 包含翻譯過(guò)的消息
models/ 包含模型的類(lèi)文件
LoginForm.php ‘login’ 動(dòng)作的表單模型
ContactForm.php ‘contact’ 動(dòng)作的表單模型
runtime/ 包含臨時(shí)生成的文件
tests/ 包含測(cè)試腳本
views/ 包含控制器的視圖和布局文件
layouts/ 包含布局視圖文件
main.php 所有視圖的默認(rèn)布局
column1.php 用單列頁(yè)面使用的布局
column2.php 使用雙列的頁(yè)面使用的布局
site/ 包含 ‘site’ 控制器的視圖文件
pages/ 包含 “靜態(tài)” 頁(yè)面
about.php “about” 頁(yè)面的視圖
contact.php ‘contact’ 動(dòng)作的視圖
error.php ‘error’ 動(dòng)作的視圖(顯示外部錯(cuò)誤)
index.php ‘index’ 動(dòng)作的視圖
login.php ‘login’ 動(dòng)作的視圖
system/ 包含系統(tǒng)視圖文件
在正式開(kāi)發(fā) Yii 應(yīng)用前,先粗略看一下 Yii 提供的類(lèi)庫(kù) http://www.yiiframework.com/doc/api/ , 下圖列出來(lái) Yii Framework 提供的類(lèi)庫(kù)的包定義:
http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/2.1.jpg" alt="picture 2.1" />
只有先了解 Yii 應(yīng)用的主要組成部分和每個(gè)類(lèi)包支持的主要功能,才能后續(xù)比較靈活的使用 Yii 來(lái)開(kāi)發(fā) Web 應(yīng)用。