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

Yii Framework 開發(fā)教程(1) 第一個(gè)應(yīng)用 Hello World

Yii Framework 教程可以參見官方中文文檔 ,那么為什么還要寫這個(gè)開發(fā)教程呢? 本教程目的是通過不同的視角(主要是通過開發(fā) Windows 應(yīng)用 C++,C#程序員的角度)幫助 Windows 桌面應(yīng)用或 ASP.Net 程序員較快的掌握 PHP Yii Framework 應(yīng)用程序框架。 使用 PHP 開發(fā) Web 應(yīng)用的一個(gè)重要好處是可以應(yīng)用于各種操作系統(tǒng)(Unix,Windows,Mac OS),而不像 Asp.Net 一般只能應(yīng)用中 Windows 操作系統(tǒng)上。使用 PHP+Apache+MySQL (XMAP/LAMP) 幾乎可以打遍天下無敵手:-)。

本教程所使用的操作系統(tǒng)為 Windows,開發(fā) IDE 為 VS.PHP,之所以使用這個(gè)開發(fā)環(huán)境是因?yàn)?VS.PHP 采用 Visual Studio 作為 IDE ,對(duì)于 Visual Studio 開發(fā)人員比較熟悉。而且可以用來同時(shí)開發(fā)調(diào)試 C#,PHP 應(yīng)用。 Yii Framework 本身和 IDE 無關(guān),你可以使用你喜歡的 PHP 開發(fā)工具來開發(fā) Yii 應(yīng)用(比如 Eclipse)。關(guān)于 VS.PHP 的介紹可以參見 VS.PHP + YiiFramework 組合開發(fā) PHP 應(yīng)用。本教程關(guān)于 Yii Framework 知識(shí)也和開發(fā) IDE 無關(guān),可以應(yīng)用到各種開發(fā)環(huán)境,你可以選擇你自己喜歡的開發(fā)環(huán)境。

在創(chuàng)建第一個(gè)應(yīng)用之間,需要下載 Yii 開發(fā)包,下載可以到 Yii 網(wǎng)站 http://www.yiiframework.com/download/ 下載,目前版本為 1.1.12, 下載后直接解壓,為方便起見將其解壓到 C:根目錄下:

http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/1.1.jpg" alt="圖片1.1" />

使用 VS.PHP 的還有一個(gè)好處是其自帶了 Apache Web 服務(wù)器,因此無需另外安裝,你也可以安裝 XAMP (Apache+MySQL+PHP) ,但如需要使用 MySQL,則另外需安裝 MySQL.

安裝好 Yii Framework 之后,我們就使用 VS.PHP 來創(chuàng)建第一個(gè) PHP 應(yīng)用,Hello World。

http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/1.2.jpg" alt="圖片1.2" />

VS.PHP 創(chuàng)建 HelloWorld 項(xiàng)目,并添加一個(gè) index.php 文件。

此時(shí)修改 index.php 為


    <?php
    print "Hello, World!";

    ?>

按 F5 運(yùn)行程序,VS.PHP 打開確省瀏覽器,顯示“Hello,World!”. 但這不是一個(gè) Yii 應(yīng)用?。?!,我們還沒有使用 Yii Web 應(yīng)用程序框架,Yii Framework 是一個(gè)純面向?qū)ο蟮膽?yīng)用程序框架。其 Web 程序的 Application 類為 CWebApplication 類。并采用了 MVC 模型。

下面的示意圖展示了 Yii 應(yīng)用的靜態(tài)結(jié)構(gòu)

http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/1.3.jpg" alt="圖片1.3" />

下圖展示了一個(gè) Yii 應(yīng)用在處理用戶請(qǐng)求時(shí)典型的工作流

http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/1.4.jpg" alt="圖片1.4" />

  1. 用戶發(fā)出了訪問 URL http://www.example.com/index.php?r=post/show&id=1 的請(qǐng)求, Web 服務(wù)器通過執(zhí)行入口腳本 index.php 處理此請(qǐng)求。
  2. 入口腳本創(chuàng)建了一個(gè)應(yīng)用實(shí)例并執(zhí)行。
  3. 應(yīng)用從一個(gè)叫做 request 的應(yīng)用組件 中獲得了用戶請(qǐng)求的詳細(xì)信息。
  4. 應(yīng)用在一個(gè)名叫 urlManager 的應(yīng)用組件的幫助下,決定請(qǐng)求的控制器和動(dòng)作 。在這個(gè)例子中,控制器是 post,它代表 PostController 類; 動(dòng)作是 show ,其實(shí)際含義由控制器決定。
  5. 應(yīng)用創(chuàng)建了一個(gè)所請(qǐng)求控制器的實(shí)例以進(jìn)一步處理用戶請(qǐng)求。控制器決定了動(dòng)作 show 指向控制器類中的一個(gè)名為 actionShow 的方法。然后它創(chuàng)建并持行了與動(dòng)作關(guān)聯(lián)的過濾器(例如訪問控制,基準(zhǔn)測(cè)試)。 如果過濾器允許,動(dòng)作將被執(zhí)行。
  6. 動(dòng)作從數(shù)據(jù)庫(kù)中讀取一個(gè) ID 為 1 的 Post 模型。
  7. 動(dòng)作通過 Post 模型渲染一個(gè)名為 show 的 視圖。
  8. 視圖讀取并顯示 Post 模型的屬性。
  9. 視圖執(zhí)行一些小物件。
  10. 視圖的渲染結(jié)果被插入一個(gè)布局。
  11. 動(dòng)作完成視圖渲染并將其呈現(xiàn)給用戶。

Yii 應(yīng)用本身有很多配置,比如缺省的 Controller ,action 是否使用 Log 文件等。對(duì)于 Hello,World 這個(gè)簡(jiǎn)單的應(yīng)用,就全部使用缺省值。缺省的 Controller 為 SiteController, Action 為 indexAction. 也就是說,比如你的網(wǎng)站為 www.guidebee.com ,如果你采用 Yii Framework, 用戶請(qǐng)求 www.guidebee.com 時(shí),Yii 應(yīng)用的 CWebApplication 將創(chuàng)建類 SiteController 的實(shí)例并調(diào)用 SiteController 的 indexAction 方法,(相當(dāng)于 C# Console 應(yīng)用的 Program 的 main 方法)。

Yii 項(xiàng)目使用不同的目錄來存放 Controller,Action,View,Layout 等,其缺省目錄結(jié)構(gòu)如下

    testdrive/
    index.php                 Web 應(yīng)用入口腳本文件
    index-test.php            功能測(cè)試使用的入口腳本文件
    assets/                   包含公開的資源文件
    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/            包含可重用的用戶組件
         Controller.php      所有控制器類的基礎(chǔ)類
         Identity.php        用來認(rèn)證的 'Identity' 類
      config/                包含配置文件
         console.php         控制臺(tái)應(yīng)用配置
         main.php            Web 應(yīng)用配置
         test.php            功能測(cè)試使用的配置
      controllers/           包含控制器的類文件
         SiteController.php  默認(rèn)控制器的類文件
      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/              包含翻譯過的消息
      models/                包含模型的類文件
         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)視圖文件

這個(gè)目錄結(jié)構(gòu)可以通過 Yii 自帶的工具來創(chuàng)建缺省的文件建立第一個(gè) Yii 應(yīng)用。

對(duì)于 Hello World 項(xiàng)目來說,沒有必要這么復(fù)雜,我們只需創(chuàng)建 protected \controllers 目錄以存放 SiteController.php。

每個(gè) Yii 應(yīng)用都有的入口腳本,可以理解為 C#的 Program 類。這個(gè)入口腳本大同小異

    <?php

    // 包含Yii引導(dǎo)文件
    //require_once(dirname(__FILE__).'/../../framework/yii.php');
    $yii='C:/yiiframework/yii.php';
    // 發(fā)布應(yīng)用時(shí),去掉下面代碼避免產(chǎn)生調(diào)試信息
    defined('YII_DEBUG') or define('YII_DEBUG',true);

    require_once($yii);
    // 創(chuàng)建一個(gè)應(yīng)用實(shí)例并執(zhí)行

    Yii::createWebApplication()->run();

前面說過 Yii 的缺省 Controller為SiteController,缺省 Action 為 actionIndex, 因此 HelloWorld 的 SiteController 代碼如下:

    /**
     * SiteController is the default controller to handle user requests.
     */
    class SiteController extends CController
    {
        /**
         * Index action is the default action in a controller.
         */
        public function actionIndex()
        {
            echo 'Hello World';
        }
    }

此時(shí)再運(yùn)行應(yīng)用,可以在瀏覽器中顯示“Hello,World”。 目前沒有使用 MVC 模型直接在 Controller 使用 echo 打印出“Hello,World”, 下面稍微修改一下代碼,創(chuàng)建一個(gè)簡(jiǎn)單的 View。

View 缺省目錄為 protected 目錄下的 views 子目錄,和 Controller 類對(duì)于,比如 SiteController 對(duì)應(yīng)到 Views 目錄下的 site 子目錄,和 Asp.Net 一樣,Yii 的 View(對(duì)應(yīng)到 Asp.Net 的 Page 類)也可以使用 MasterPage,Yii 應(yīng)用成為 Layout,缺省 Layout 存放在 views 的 layouts 子目錄。

http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/1.5.jpg" alt="圖片1.5" />

修改 SiteController 的 actionIndex 方法,改為:

    public function actionIndex()
    {
     $this->render("index");
    }

View 視圖是一個(gè)包含了主要的用戶交互元素的 PHP 腳本.他可以包含 PHP 語句,但是我們建議這些語句不要去改變數(shù)據(jù)模型,且最好能夠保持其單純性(單純作為視圖)。為了實(shí)現(xiàn)邏輯和界面分離,大段的邏輯應(yīng)該被放置于控制器或模型中,而不是視圖中,視圖有一個(gè)名字,當(dāng)渲染(render)時(shí),名字會(huì)被用于識(shí)別視圖腳本文件。

actionIndex 通過 render 方法來顯示一個(gè) View,對(duì)應(yīng)到 views->site 目錄下的 index.php 。render 缺省使用 views ->layouts 下的 main.php 作為 Layout (布局,MasterPage)

布局是一種用來修飾視圖的特殊的視圖文件.它通常包含了用戶界面中通用的一部分視圖.例如:布局可以包含 header 和 footer 的部分,然后把內(nèi)容嵌入其間.

    ......header here......
    <?php echo $content; ?>
    ......footer here......

其中的 $content 則儲(chǔ)存了內(nèi)容視圖的渲染結(jié)果.

來看一下View是目錄下的 index.php (View) 代碼:

http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/1.6.jpg" alt="圖片1.6" />

本例下載