鍍金池/ 教程/ PHP/ Yii Framework 開(kāi)發(fā)教程(2) Yii Web 應(yīng)用基礎(chǔ)
Yii Framework 開(kāi)發(fā)教程(16) UI 組件 StarRating 示例
Yii Framework 開(kāi)發(fā)教程(2) Yii Web 應(yīng)用基礎(chǔ)
Yii Framework 開(kāi)發(fā)教程(19) UI 組件 TreeView 示例
Yii Framework 開(kāi)發(fā)教程(39) Zii 組件-Slider 示例
Yii Framework 開(kāi)發(fā)教程(45) Zii 組件-Selectable 示例
Yii Framework 開(kāi)發(fā)教程(44) Zii 組件-Resizable 示例
Yii Framework 開(kāi)發(fā)教程(8) 使用 FormModel
Yii Framework 開(kāi)發(fā)教程(42) Zii 組件-Draggable 示例
Yii Framework 開(kāi)發(fā)教程(18) UI 組件 TextHighlighter 示例
Yii Framework 開(kāi)發(fā)教程(32) Zii 組件-GridView 示例
Yii Framework 開(kāi)發(fā)教程(30) Zii 組件-ListView 示例
Yii Framework 開(kāi)發(fā)教程(9) UI 組件 Widget 概述
Yii Framework 開(kāi)發(fā)教程(17) UI 組件 TabView 示例
Yii Framework 開(kāi)發(fā)教程(24) 數(shù)據(jù)庫(kù)-DAO 示例
Yii Framework 開(kāi)發(fā)教程(25) 數(shù)據(jù)庫(kù)-Query Builder 示例
Yii Framework 開(kāi)發(fā)教程(21) UI 組件 自定義 Captcha 示例
Yii Framework 開(kāi)發(fā)教程(38) Zii 組件-ProgressBar 示例
Yii Framework 開(kāi)發(fā)教程(20) UI 組件 Captcha 示例
Yii Framework 開(kāi)發(fā)教程(14) UI 組件 MaskedTextField 示例
Yii Framework 開(kāi)發(fā)教程(22) UI 組件 Zii 組件簡(jiǎn)介
Yii Framework 開(kāi)發(fā)教程(31) Zii 組件-DetailView 示例
Yii Framework 開(kāi)發(fā)教程(33) Zii 組件-Accordion 示例
Yii Framework 開(kāi)發(fā)教程(36) Zii 組件-DatePicker 示例
Yii Framework 開(kāi)發(fā)教程(6) CComponent 組件
Yii Framework 開(kāi)發(fā)教程(37) Zii 組件-Dialog 示例
Yii Framework 開(kāi)發(fā)教程(26) 數(shù)據(jù)庫(kù)-Active Record 示例
Yii Framework 開(kāi)發(fā)教程(29) Zii組件-Menu 示例
Yii Framework 開(kāi)發(fā)教程(46) Zii 組件-Sortable 示例
Yii Framework 開(kāi)發(fā)教程(10) UI 組件 自定義組件
Yii Framework 開(kāi)發(fā)教程(11) UI 組件 ActiveForm 示例
Yii Framework 開(kāi)發(fā)教程(43) Zii 組件-Droppable 示例
Yii Framework 開(kāi)發(fā)教程(27) 數(shù)據(jù)庫(kù)-關(guān)聯(lián) Active Record 示例
Yii Framework 開(kāi)發(fā)教程(47) 主題 Theme 示例
Yii Framework 開(kāi)發(fā)教程(48) 多國(guó)語(yǔ)言示例
Yii Framework 開(kāi)發(fā)教程(35) Zii 組件-Button 示例
Yii Framework 開(kāi)發(fā)教程(3) 為應(yīng)用添加日志
Yii Framework 開(kāi)發(fā)教程(23) 數(shù)據(jù)庫(kù)-概述
Yii Framework 開(kāi)發(fā)教程(12) UI 組件 ClipWidget 示例
Yii Framework 開(kāi)發(fā)教程(41) Zii 組件-Tabs 示例
Yii Framework 開(kāi)發(fā)教程(34) Zii 組件-AutoComplete 示例
Yii Framework 開(kāi)發(fā)教程(40) Zii 組件-SliderInput 示例
Yii Framework 開(kāi)發(fā)教程(5) URL 管理
Yii Framework 開(kāi)發(fā)教程(4) Hangman 猜單詞游戲?qū)嵗?/span>
Yii Framework 開(kāi)發(fā)教程(15) UI 組件 MultiFileUpload 示例
Yii Framework 開(kāi)發(fā)教程(7) 使用 CHtml 創(chuàng)建 Form
Yii Framework 開(kāi)發(fā)教程(28) Data Provider 簡(jiǎn)介
Yii Framework 開(kāi)發(fā)教程(1) 第一個(gè)應(yīng)用 Hello World
Yii Framework 開(kāi)發(fā)教程(13) UI 組件 ContentDecorator 示例

Yii Framework 開(kāi)發(fā)教程(2) Yii Web 應(yīng)用基礎(chǔ)

有了前面的“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)。

主應(yīng)用實(shí)例(CWebApplication)

默認(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)用的 namedefaultController 屬性。

    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)用組件

應(yīng)用的功能可以通過(guò)其靈活的組件結(jié)構(gòu)輕易地自定義或增強(qiáng)。應(yīng)用管理了一系列應(yīng)用組件,每個(gè)組件實(shí)現(xiàn)一特定功能。 例如,應(yīng)用通過(guò) CUrlManagerCHttpRequest 的幫助解析來(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。

CWebApplication的的生命周期

當(dāng)處理用戶(hù)請(qǐng)求時(shí),應(yīng)用將經(jīng)歷如下聲明周期:

  1. 通過(guò) CApplication::preinit() 預(yù)初始化應(yīng)用;
  2. 設(shè)置類(lèi)的自動(dòng)裝載器和錯(cuò)誤處理;
  3. 注冊(cè)核心類(lèi)組件;
  4. 加載應(yīng)用配置;
  5. 通過(guò) CApplication::init() 初始化應(yīng)用:
    • 注冊(cè)應(yīng)用行為;
    • 載入靜態(tài)應(yīng)用組件;
  6. 觸發(fā) onBeginRequest 事件;
  7. 處理用戶(hù)請(qǐng)求:
    • 解析用戶(hù)請(qǐng)求;
    • 創(chuàng)建控制器;
    • 運(yùn)行控制器; 8.觸發(fā) onEndRequest 事件。

CController控制類(lèi)

控制器 是 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ì)象中的屬性。

視圖View

視圖是一個(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)用。