程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> Yii快速入門經典教程

Yii快速入門經典教程

編輯:PHP綜合

本文講述了Yii快速入門教程。分享給大家供大家參考,具體如下:

Ⅰ、基本概念

一、入口文件

入口文件內容:一般格式如下:

<?php
$yii=dirname(__FILE__).'/../../framework/yii.php';//Yii框架位置
$config=dirname(__FILE__).'/protected/config/main.php';//當前應用程序的主配置文件位置
// 部署正式環境時,去掉下面這行
// defined('YII_DEBUG') or define('YII_DEBUG',true);//是否運行在調試模式下
require_once($yii);//包含Yii框架
Yii::createWebApplication($config)->run();//根據主配置文件建立應用實例,並運行。你可以在當前應用的任何位置通過Yii::app()來訪問這個實例。

二、主配置文件

保存位置:你的應用/protected/config/main.php

文件內容:一般格式如下:

<?php
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', //當前應用根目錄的絕對物理路徑
'name'=>'Yii Blog Demo', //當前應用的名稱
// 預載入log(記錄)應用組件,這表示該應用組件無論它們是否被訪問都要被創建。該應用的參數配置在下面以“components”為關鍵字的數組中設置。
'preload'=>array('log'), //log為組件ID
// 自動載入的模型和組件類
'import'=>array(
'application.models.*', //載入“application/models/”文件夾下的所有模型類
'application.components.*', //載入“application/components/”文件夾下的所有應用組件類
),
'defaultController'=>'post', //設置默認控制器類
// 當前應用的組件配置。更多可供配置的組件詳見下面的“核心應用組件”
'components'=>array(
'user'=>array( //user(用戶)組件配置,“user”為組件ID
// 可以使用基於cookie的認證
'allowAutoLogin'=>true, //允許自動登錄
),
'cache'=>array( //緩存組件
'class'=>'CMemCache', //緩存組件類
'servers'=>array( //MemCache緩存服務器配置
array('host'=>'server1', 'port'=>11211, 'weight'=>60), //緩存服務器1
array('host'=>'server2', 'port'=>11211, 'weight'=>40), //緩存服務器2
),
),
'db'=>array( //db(數據庫)組件配置,“db”為組件ID
'connectionString' => 'sqlite:protected/data/blog.db', //連接數據庫的DSN字符串
'tablePrefix' => 'tbl_', //數據表前綴
),
// 如果要使用一個MySQL數據庫,請取消下面的注釋
'errorHandler'=>array(
// 使用SiteController控制器類中的actionError方法顯示錯誤
'errorAction'=>'site/error', //遇到錯誤時,運行的操作。控制器名和方法名均小寫,並用斜線“/”隔開
),
//URL路由管理器
'urlManager'=>array(
'urlFormat'=>'path', //URL格式。共支持兩種格式:'path'格式(如:/path/to/EntryScript.php/name1/value1/name2 /value2...)和'get'格式(如: /path/to/EntryScript.php?name1=value1&name2=value2...)。當使用'path'格式時,需要設置如下的規則:
'rules'=>array( //URL規則。語法:<參數名:正則表達式>
'post/<id:\d+>/<title:.*?>'=>'post/view', //將post/12/helloword指向post/view?id=12&title=helloword
'posts/<tag:.*?>'=>'post/index', //將posts/hahahaha指向post/index?tag=hahahaha
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
'log'=>array( //記錄
'class'=>'CLogRouter', //處理記錄信息的類
'routes'=>array(
array(
'class'=>'CFileLogRoute', //處理錯誤信息的類
'levels'=>'error, warning', //錯誤等級
),
// 如要將錯誤記錄消息在網頁上顯示,取消下面的注釋即可
),
),
), //應用組件配置結束
// 使用Yii::app()->params['參數名']可以訪問應用層的參數
'params'=>require(dirname(__FILE__).'/params.php'),
);

核心應用組件:

Yii 預定義了一系列核心應用組件,提供常見 Web 應用中所用的功能。例如, request 組件用於解析用戶請求並提供例如 URL,cookie 等信息。通過配置這些核心組件的屬性,我們可以幾乎任意的修改Yii 的默認行為。

下面我們列出了由 CWebApplication 預定義的核心組件。

assetManager: CAssetManager - 管理私有資源文件的發布。
authManager: CAuthManager - 管理基於角色的訪問控制 (RBAC).
cache: CCache - 提供數據緩存功能。注意,你必須指定實際的類(例如CMemCache, CDbCache)。否則,當你訪問此組件時將返回 NULL。
clientScript: CClientScript - 管理客戶端腳本 (javascripts 和 CSS).
coreMessages: CPhpMessageSource - 提供 Yii 框架用到的核心信息的翻譯。
db: CDbConnection - 提供數據庫連接。注意,使用此組件你必須配置其 connectionString 屬性。
errorHandler: CErrorHandler - 處理未捕獲的 PHP 錯誤和異常。
format: CFormatter - 格式化數值顯示。此功能從版本 1.1.0 起開始提供。
messages: CPhpMessageSource - 提供Yii應用中使用的信息翻譯。
request: CHttpRequest - 提供關於用戶請求的信息。
securityManager: CSecurityManager - 提供安全相關的服務,例如散列,加密。
session: CHttpSession - 提供session相關的功能。
statePersister: CStatePersister - 提供全局狀態持久方法。
urlManager: CUrlManager - 提供 URL 解析和創建相關功能
user: CWebUser - 提供當前用戶的識別信息。
themeManager: CThemeManager - 管理主題。

要訪問一個應用組件,使用 Yii::app()->組件的ID

三、控制器(Controller)

控制器 是 CController 類的子類的實例。它在當用戶請求時由應用創建。當一個控制器運行時,它執行所請求的動作(控制器類方法),動作通常會引入所必要的模型並渲染相應的視圖。動作,就是一個名字以 action 開頭的控制器類方法(action+大寫首字母的動作名)。

控制器類文件保存位置protected/controllers/

控制器和動作以 ID 識別。

控制器ID 是一種 '父目錄/子目錄/控制器名' 的格式,對應相應的控制器類文件 protected/controllers/父目錄/子目錄/大寫首字母的控制器名Controller.php;

動作ID 是除去 action 前綴的動作方法名。

1、路由

用戶以路由的形式請求特定的控制器和動作。路由是由控制器 ID 和動作 ID 連接起來的,兩者以斜線分割。

例如,路由 post/edit 代表 PostController 及其 edit 動作。默認情況下,URL http://hostname/index.php?r=post/edit 即請求此控制器和動作。

注意: 默認情況下,路由是大小寫敏感的。可以通過設置應用配置中的 CUrlManager::caseSensitive 為 false 使路由對大小寫不敏感。當在大小寫不敏感模式中時, 要確保你遵循了相應的規則約定,即:包含控制器類文件的目錄名小寫,且 控制器映射 和動作映射 中使用的鍵為小寫。

路由的格式:控制器ID/動作ID 或 模塊ID/控制器ID/動作ID(如果是嵌套模塊,模塊ID 就是父模塊ID/子模塊ID)

2、控制器實例化

應用將使用如下規則確定控制器的類以及類文件的位置:

① 、如果指定了 CWebApplication::catchAllRequest , 控制器將基於此屬性創建,而用戶指定的控制器 ID 將被忽略。這通常用於將應用設置為維護狀態並顯示一個靜態提示頁面。

② 、如果在 CWebApplication::controllerMap 中找到了 ID, 相應的控制器配置將被用於創建控制器實例。

③ 、如果 ID 為 'path/to/xyz'的格式,控制器類的名字將判斷為 XyzController,相應的類文件則為 protected/controllers/path/to/XyzController.php。如果類文件不存在,將觸發一個 404 CHttpException 異常。

在使用了模塊的情況下,應用將檢查此 ID 是否代表一個模塊中的控制器。如果是的話,模塊實例將被首先創建,然後創建模塊中的控制器實例。

3、動作(action)

動作 就是被定義為一個以 action 單詞作為前綴命名的方法。而更高級的方式是定義一個動作類並讓控制器在收到請求時將其實例化。這使得動作可以被復用,提高了可復用度。

1、定義一個動作類,基本格式如下:

class UpdateAction extends CAction
{
public function run()
{
// place the action logic here
}
}

2、使用動作類:為了讓控制器注意到這個動作,我們要用如下方式覆蓋控制器類的actions() 方法:

class PostController extends CController
{
public function actions()
{
return array(
'edit'=>'application.controllers.post.UpdateAction', //使用“應用程序文件夾/controllers/post/UpdateAction.php”文件中的類來處理edit動作
);
}
}

如上所示,我們使用了路徑別名“application.controllers.post.UpdateAction”指定動作類文件為“protected/controllers/post/UpdateAction.php”。

通過編寫基於類的動作,我們可以將應用組織為模塊的風格。例如,如下目錄結構可用於組織控制器相關代碼:

protected/
controllers/
PostController.php
UserController.php
post/
CreateAction.php
ReadAction.php
UpdateAction.php
user/
CreateAction.php
ListAction.php
ProfileAction.php
UpdateAction.php

4、過濾器(filter)

過濾器是一段代碼,可被配置在控制器動作執行之前或之後執行。

一個動作可以有多個過濾器。如有多個過濾器,則按照它們出現在過濾器列表中的順序依次執行。過濾器可以阻止動作及後面其他過濾器的執行。

過濾器可以定義為一個控制器類的方法。過濾器方法名必須以 filter 開頭。例如,現有的 filterAccessControl 方法定義了一個名為 accessControl 的過濾器。過濾器方法必須為如下結構:

public function filterAccessControl($filterChain)
{
// 調用 $filterChain->run() 以繼續後續過濾器與動作的執行。
}

$filterChain (過濾器鏈)是一個 CFilterChain 的實例,代表與所請求動作相關的過濾器列表。在過濾器方法中,我們可以調用 $filterChain->run() 以繼續執行後續過濾器和動作。

如 動作 一樣,過濾器也可以是一個對象,它是 CFilter 或其子類的實例。如下代碼定義了一個新的過濾器類:

class PerformanceFilter extends CFilter
{
protected function preFilter($filterChain)
{
// 動作被執行之前應用的邏輯
return true; // 如果動作不應被執行,此處返回 false
}
protected function postFilter($filterChain)
{
// 動作執行之後應用的邏輯
}
}

要對動作應用過濾器,我們需要覆蓋 CController::filters() 方法。此方法應返回一個過濾器配置數組。例如:

class PostController extends CController
{
......
public function filters()
{
return array(
'postOnly + edit, create', //將postOnly過濾器應用於edit和create動作(這是基於方法的過濾器)
array( //使用了數組來配置過濾器
'application.filters.PerformanceFilter - edit, create', //將application.filters.PerformanceFilter過濾器應用於除了edit和create之外的所有動作(這是基於對象的過濾器)
'unit'=>'second', //初始化過濾器對象中的unit屬性值為second
),
);
}
}

上述代碼指定了兩個過濾器: postOnly 和 PerformanceFilter。 postOnly 過濾器是基於方法的(相應的過濾器方法已在 CController 中定義);而 performanceFilter 過濾器是基於對象的。路徑別名 application.filters.PerformanceFilter 指定過濾器類文件是 protected/filters/PerformanceFilter。我們使用一個數組配置 PerformanceFilter ,這樣它就可被用於初始化過濾器對象的屬性值。此處 PerformanceFilter 的 unit 屬性值將被初始為 second。

使用加減號,我們可指定哪些動作應該或不應該應用過濾器。上述代碼中, postOnly 應只被應用於 edit 和 create 動作,而 PerformanceFilter 應被應用於 除了 edit 和 create 之外的動作。如果過濾器配置中沒有使用加減號,則此過濾器將被應用於所有動作。

五、模型(Model)

模型是 CModel 或其子類的實例。模型用於保持數據以及與其相關的業務邏輯。

模型是單獨的數據對象。它可以是數據表中的一行,或者一個用戶輸入的表單。

數據對象的每個字段對應模型中的一個屬性。每個屬性有一個標簽(label),並且可以通過一系列規則進行驗證。

Yii 實現了兩種類型的模型:表單模型和 Active Record。二者均繼承於相同的基類 CModel。

表單模型是 CFormModel 的實例。表單模型用於保持從用戶的輸入獲取的數據。這些數據經常被獲取,使用,然後丟棄。例如,在一個登錄頁面中,我們可以使用表單模型用於表示由最終用戶提供的用戶名和密碼信息。

Active Record (AR) 是一種用於通過面向對象的風格抽象化數據庫訪問的設計模式。每個 AR 對象是一個 CActiveRecord 或其子類的實例。代表數據表中的一行。行中的字段對應 AR 對象中的屬性。

六、視圖

視圖是一個包含了主要的用戶交互元素的PHP腳本.

視圖有一個名字,當渲染(render)時,名字會被用於識別視圖腳本文件。視圖的名稱與其視圖腳本名稱是一樣的。例如:視圖 edit 的名稱出自一個名為 edit.php 的腳本文件。要渲染時,需通過傳遞視圖的名稱調用 CController::render()。這個方法將在“protected/views/控制器ID”目錄下尋找對應的視圖文件。

在視圖腳本內部,我們可以通過 $this 來訪問控制器實例。我們可以在視圖裡以“$this->屬性名”的方式獲取控制器的任何屬性。

我們也可以用以下 推送 的方式傳遞數據到視圖裡:

$this->render('edit', array(
'var1'=>$value1,
'var2'=>$value2,
));

在以上的方式中, render() 方法將提取數組的第二個參數到變量裡。其產生的結果是,在視圖腳本裡,我們可以直接訪問變量 $var1 和 $var2。

1、布局

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

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

其中的 $content 則儲存了內容視圖的渲染結果。

當使用render()時,布局被隱式應用。視圖腳本 protected/views/layouts/main.php 是默認的布局文件。這可以通過改變 CWebApplication::layout 進行自定義。要渲染一個不帶布局的視圖,則需調用 renderPartial() 。

2、小物件

小物件是 CWidget 或其子類的實例。它是一個主要用於表現數據的組件。小物件通常內嵌於一個視圖來產生一些復雜而獨立的用戶界面。例如,一個日歷小物件可用於渲染一個復雜的日歷界面。小物件使用戶界面更加可復用。

我們可以按如下視圖腳本來使用一個小物件:

<?php $this->beginWidget('小物件類的路徑別名'[,'包含屬性初始化值的數組']); ?>
...可能會由小物件獲取的內容主體...
<?php $this->endWidget(); ?>

或者

<?php $this->widget('小物件類的路徑別名'[,'包含屬性初始化值的數組']); ?>

後者用於不需要任何 body 內容的組件。

小物件可通過配置來定制它的表現。這是通過調用 CBaseController::beginWidget 或 CBaseController::widget 設置其初始化屬性值來完成的。

我們通過傳遞一個攜帶這些屬性初始化值的數組來實現,該數組的鍵是屬性的名稱,而數組的值則是小物件屬性所對應的值。如下所示 :

<?php
$this->widget('CMaskedTextField',array(
'mask'=>'99/99/9999'
));
?>

繼承 CWidget 並覆蓋其init()和run()方法,可以定義一個新的小物件:

class MyWidget extends CWidget
{
public function init()
{
// 此方法會被 CController::beginWidget() 調用
}
public function run()
{
// 此方法會被 CController::endWidget() 調用
}
}

小物件可以像一個控制器一樣擁有它自己的視圖。

默認情況下,小物件的視圖文件位於包含了小物件類文件目錄的 views 子目錄之下(protected/components/views)。這些視圖可以通過調用CWidget::render()渲染,這一點和控制器很相似。唯一不同的是,小物件的視圖沒有布局文件支持。另外,小物件視圖中的$this指向小物件實例而不是控制器實例。

3、系統視圖

系統視圖的渲染通常用於展示 Yii 的錯誤和日志信息。

系統視圖的命名遵從了一些規則。比如像“errorXXX”這樣的名稱就是用於渲染展示錯誤號XXX的 CHttpException 的視圖。例如,如果 CHttpException 拋出一個404錯誤,那麼 error404 就會被顯示。

在 framework/views 下, Yii 提供了一系列默認的系統視圖. 他們可以通過在 protected/views/system 下創建同名視圖文件進行自定義。

七、組件

Yii 應用建立於組件之上。組件是 CComponent 或其子類的實例。使用組件主要涉及訪問它的屬性以及觸發或處理它的時間。基類 CComponent 指定了如何定義屬性和事件。

1、組件屬性

組件的屬性就像對象的公共成員變量。它是可讀寫的。

要定義一個組件屬性,我們只需在組件類中定義一個公共成員變量即可。

更靈活的方式是定義其 getter 和 setter 方法,例如:

public function getTextWidth() // 獲取 textWidth 屬性
{
return $this->_textWidth;
}
public function setTextWidth($value) // 設置 TextWidth 屬性
{
$this->_textWidth=$value;
}

上述代碼定義了一個可寫的屬性名為 textWidth(名字是大小寫不敏感的)。當讀取屬性時,getTextWidth() 就會被調用,其返回值則成為屬性值;相似的,當寫入屬性時,setTextWidth() 被調用。如果 setter 方法沒有定義,則屬性將是只讀的,如果對其寫入則會拋出一個異常。使用 getter 和 setter 方法定義一個屬性有一個好處:即當讀取或寫入屬性時,可以執行額外的邏輯(例如,執行驗證,觸發事件)。

注意: 通過 getter/setter 定義的屬性和類成員變量之間有一個細微的差異:屬性的名字是大小寫不敏感的, 而 類成員變量是大小寫敏感的。

2、組件事件

組件事件是一些特殊的屬性,它們使用一些稱作 事件句柄(event handlers)的方法作為其值。分配一個方法到一個事件將會引起方法在事件被喚起處自動被調用。因此,一個組件的行為可能會被一種在部件開發過程中不可預見的方式修改。
組件事件以 on 開頭的命名方式定義。和屬性通過 getter/setter 方法來定義的命名方式一樣,事件的名稱是大小寫不敏感的。以下代碼定義了一個 onClicked 事件:

public function onClicked($event)
{
$this->raiseEvent('onClicked', $event);
}

這裡作為事件參數的 $event 是 CEvent 或其子類的實例。

我們可以分配一個方法到此事件,如下所示:
復制代碼 代碼如下:$component->onClicked=$callback;
這裡的 $callback 指向了一個有效的 PHP 回調。它可以是一個全局函數也可以是類中的一個方法。如果是後者,它必須以一個數組的方式提供: array($object,'methodName')。

事件句柄的結構如下:

function 方法名($event)
{
......
}

這裡的 $event 即描述事件的參數(它來源於 raiseEvent() 調用)。$event 參數是 CEvent 或其子類的實例。至少,它包含了關於誰觸發了此事件的信息。

事件句柄也可以是一個PHP 5.3以後支持的匿名函數。例如:

$component->onClicked=function($event) {
......
}

如果我們現在調用 onClicked(),onClicked 事件將被觸發(在 onClicked() 中),附屬的事件句柄將被自動調用。

一個事件可以綁定多個句柄。當事件觸發時,這些句柄將被按照它們綁定到事件時的順序依次執行。如果句柄決定組織後續句柄被執行,它會設置 $event->handled 為 true。

3、組件行為

組件已添加了對 mixin 的支持,並可以綁定一個或多個行為。行為是一個對象,其方法可以被它綁定的部件通過收集功能的方式來實現繼承(inherited),而不是專有化繼承(即普通的類繼承)。一個部件可以以'多重繼承'的方式實現多個行為的綁定。

行為類必須實現 IBehavior 接口。 大多數行為可以繼承自 CBehavior 。如果一個行為需要綁定到一個模型, 它也可以從專為模型實現綁定特性的 CModelBehavior 或 CActiveRecordBehavior 繼承。

要使用一個行為,它必須首先通過調用此行為的 attach() 方法綁定到一個組件。然後我們就可以通過組件調用此行為方法:

// $name 在組件中實現了對行為的唯一識別
$component->attachBehavior($name,$behavior);
// test() 是行為中的方法。
$component->test();

已綁定的行為可以像一個組件中的普通屬性一樣訪問。例如,如果一個名為 tree 的行為綁定到了一個組件,我們就可以通過如下代碼獲得指向此行為的引用。

$behavior=$component->tree;
// 等於下行代碼:
// $behavior=$component->asa('tree');

行為是可以被臨時禁止的,此時它的方法就會在組件中失效。例如:

$component->disableBehavior($name);
// 下面的代碼將拋出一個異常
$component->test();
$component->enableBehavior($name);
// 現在就可以使用了
$component->test();

兩個同名行為綁定到同一個組件下是有可能的。在這種情況下,先綁定的行為則擁有優先權。

當和 events, 一起使用時,行為會更加強大。當行為被綁定到組件時,行為裡的一些方法就可以綁定到組件的一些事件上了。這樣一來,行為就有機觀察或者改變組件的常規執行流程。

一個行為的屬性也可以通過綁定到的組件來訪問。這些屬性包含公共成員變量以及通過 getters 和/或 setters 方式設置的屬性。例如, 若一個行為有一個 xyz 的屬性,此行為被綁定到組件 $a,然後我們可以使用表達式 $a->xyz 訪問此行為的屬性。

八、模塊

模塊是一個獨立的軟件單元,它包含 模型, 視圖, 控制器 和其他支持的組件。在許多方面上,模塊看起來像一個應用。主要的區別就是模塊不能單獨部署,它必須存在於一個應用裡。用戶可以像他們訪問普通應用的控制器那樣訪問模塊中的控制器。

模塊在一些場景裡很有用。對大型應用來說,我們可能需要把它劃分為幾個模塊,每個模塊可以單獨維護和部署。一些通用的功能,例如用戶管理,評論管理,可以以模塊的形式開發,這樣他們就可以容易地在以後的項目中被復用。

1、創建模塊

模塊組織在一個目錄中,目錄名即為模塊的唯一ID。模塊目錄的結構跟 應用基礎目錄 很相似。下面列出了一個 fourm 的模塊的典型的目錄結構:

forum/ 模塊文件夾
ForumModule.php 模塊類文件
components/ 包含可復用的用戶組件
views/ 包含小物件的視圖文件
controllers/ 包含控制器類文件
DefaultController.php 默認的控制器類文件
extensions/ 包含第三方擴展
models/ 包含模型類文件
views/ 包含控制器視圖和布局文件
layouts/ 包含布局文件
default/ 包含 DefaultController 的視圖文件
index.php 首頁視圖文件

模塊必須有一個繼承自 CWebModule 的模塊類。類的名字通過表達式 ucfirst($id).'Module' 確定, 其中的 $id 代表模塊的 ID (或者說模塊的目錄名字)。模塊類是存儲模塊代碼間可共享信息的中心位置。例如,我們可以使用 CWebModule::params 存儲模塊參數,使用 CWebModule::components 分享模塊級的應用組件。

2、使用模塊

要使用模塊,首先將模塊目錄放在 應用基礎目錄的modules文件夾中。然後在應用的modules屬性中聲明模塊ID。例如,為了使用上面的forum模塊,我們可以使用如下應用配置:

return array(
......
'modules'=>array('forum',...),
......
);

模塊也可以在配置時帶有初始屬性值。做法和配置 應用組件 很類似。例如, forum 模塊可以在其模塊類中有一個名為 postPerPage 的屬性,它可以在 應用配置 中配置如下:

return array(
......
'modules'=>array(
'forum'=>array(
'postPerPage'=>20,
),
),
......
);

模塊的實例可通過當前活動控制器的 module 屬性訪問。在模塊實例中,我們可以訪問在模塊級中共享的信息。例如,為訪問上面的 postPerPage 信息,我們可使用如下表達式:

$postPerPage=Yii::app()->controller->module->postPerPage;
// 如如$this引用的是控制器實例,則可以使用下行語句
// $postPerPage=$this->module->postPerPage;

模塊中的控制器動作可以通過路由“模塊ID/控制器ID/動作ID”或“模塊ID/存放控制器類文件的子目錄名/控制器ID/動作ID”訪問。例如,假設上面的 forum 模塊有一個名為 PostController 的控制器,我們就可以通過路由 forum/post/create 訪問此控制器中的 create 動作。此路由對應的 URL 即 http://www.example.com/index.php?r=forum/post/create。

3、嵌套的模塊

模塊可以無限級嵌套。這就是說,一個模塊可以包含另一個模塊,而這另一個模塊又可以包含其他模塊。我們稱前者為 父模塊 ,後者為子模塊。子模塊必須定義在其父模塊的 modules 屬性中,就像我們前面在應用配置中定義模塊一樣。

要訪問子模塊中的控制器動作,我們應使用路由 父模塊ID/子模塊ID/控制器ID/動作ID。

九、路徑別名

Yii 中廣泛的使用了路徑別名。路徑別名關聯於一個目錄或文件的路徑。它以點號語法指定,類似於廣泛使用的名字空間(namespace)格式:

RootAlias.path.to.target

其中的 RootAlias 是某個現存目錄的別名,通過調用 YiiBase::setPathOfAlias(), 我們可以定義新的路徑別名。為方便起見,Yii 預定義了以下幾個根別名:

system: 表示 Yii 框架目錄;
zii: 表示 Zii 庫 目錄;
application: 表示應用的 基礎目錄;
webroot: 表示 入口腳本 文件所在的目錄。
ext: 表示包含了所有第三方 擴展 的目錄。

額外的,如果應用使用了 模塊, (Yii) 也為每個模塊ID定義了根別名,指向相應模塊的跟目錄。

通過使用 YiiBase::getPathOfAlias(), 別名可以被翻譯為其相應的路徑。

使用別名可以很方便的導入類的定義。例如,如果我們想包含 CController 類的定義,我們可以調用如下代碼
復制代碼 代碼如下:Yii::import('system.web.CController');
import方法跟 include 和 require 不同,它更加高效。導入(import)的類定義並不會真正被包含進來,直到它第一次被引用。多次導入同樣的名字空間也會比 include_once 和 require_once 快得多。

我們還可以使用如下語法導入整個目錄,這樣此目錄下的類文件就會在需要時被自動包含。
復制代碼 代碼如下:Yii::import('system.web.*');
除 import 外, 別名還在其他許多地方指向類。例如,路徑別名可以傳遞給 Yii::createComponent() 以創建相應類的實例。即使類文件在之前從未被包含。

不要將路徑別名和名字空間混淆了,名字空間是指對一些類名的一個邏輯組合,這樣它們就可以相互區分開,即使有相同的名字。而路徑別名是用於指向一個類文件或目錄。路徑別名與名字空間並不沖突。

十、開發規范

下面我們講解 Yii 編程中推薦的開發規范。為簡單起見,我們假設 WebRoot 是 Yii 應用安裝的目錄。

1、URL

默認情況下,Yii 識別如下格式的 URL:
http://hostname/index.php?r=ControllerID/ActionID

r 變量意為 路由(route) ,它可以被Yii解析為 控制器和動作。如果 ActionID 被省略,控制器將使用默認的動作(在CController::defaultAction中定義);如果 ControllerID 也被省略(或者 r 變量不存在),應用將使用默認的控制器(在CWebApplication::defaultController中定義)。

通過 CUrlManager 的幫助,可以創建更加可識別,更加 SEO 友好的 URL,例如 http://hostname/ControllerID/ActionID.html。

2、代碼

Yii 推薦命名變量、函數和類時使用駝峰風格,即每個單詞的首字母大寫並連在一起,中間無空格。變量名和函數名應該使它們的第一個單詞全部小寫,以使其區別於類名。對私有類成員變量來說,我們推薦以下劃線作為其名字前綴(例如: $_actionList)。

一個針對控制器類名的特殊規則是它們必須以單詞 Controller 結尾。那麼控制器ID就是類名的首字母小寫並去掉單詞Controller。例如,PageController類的ID就是 page。這個規則使應用更加安全。它還使控制器相關的URL更加簡單(例如 /index.php?r=page/index 而不是 /index.php?r=PageController/index)。

3、配置

配置是一個鍵值對數組。每個鍵代表了所配置的對象中的屬性名,每個值則為相應屬性的初始值。

類中任何可寫的屬性都可以被配置。如果沒有配置,屬性將使用它們的默認值。當配置一個屬性時,最好閱讀相應文檔以保證初始值正確。

4、文件

命名和使用文件的規范取決於它們的類型。

類文件應以它們包含的公有類命名。例如,CController 類位於 CController.php 文件中。公有類是可以被任何其他類使用的類。每個類文件應包含最多一個公有類。私有類(只能被一個公有類使用的類)可以放在使用此類的公有類所在的文件中。

視圖文件應以視圖的名字命名。例如, index 視圖位於 index.php 文件中。視圖文件是一個PHP腳本文件,它包含了用於呈現內容的HTML和PHP代碼。

配置文件可以任意命名。配置文件是一個PHP腳本,它的主要目的是返回一個體現配置的關聯數組。

5、目錄

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: 此目錄放置所有系統視圖文件。系統視圖文件是用於顯示異常和錯誤的模板。它可以通過CWebApplication::systemViewPath自定義。
WebRoot/assets: 此目錄放置公共資源文件。資源文件是可以被發布的,可由Web用戶訪問的私有文件。此目錄必須對 Web 服務器進程可寫。它可以通過 CAssetManager::basePath 自定義
WebRoot/themes: 此目錄放置應用使用的不同的主題。每個子目錄即一個主題,主題的名字即目錄的名字。它可以通過 CThemeManager::basePath 自定義。

6、數據庫

多數Web 應用是由數據庫驅動的。我們推薦在對表和列命名時使用如下命名規范。注意,這些規范並不是 Yii 所必須的。

㈠數據庫表名和列名都使用小寫命名。
㈡名字中的單詞應使用下劃線分割 (例如 product_order)。
㈢對於表名,你既可以使用單數也可以使用復數。但不要 同時使用兩者。為簡單起見,我們推薦使用單數名字。
㈣表名可以使用一個通用前綴,例如 tbl_ 。這樣當應用所使用的表和另一個應用說使用的表共存於同一個數據庫中時就特別有用。這兩個應用的表可以通過使用不同的表前綴很容易地區別開。

Ⅱ、使用表單

在 Yii 中處理表單時,通常需要以下步驟:

1. 創建用於表現所要收集數據字段的模型類。
2. 創建一個控制器動作,響應表單提交。
3. 在視圖腳本中創建與控制器動作相關的表單。

一、創建模型

在編寫表單所需的 HTML 代碼之前,我們應該先確定來自最終用戶輸入的數據的類型,以及這些數據應符合什麼樣的規則。模型類可用於記錄這些信息。正如模型章節所定義的,模型是保存用戶輸入和驗證這些輸入的中心位置。

取決於使用用戶所輸入數據的方式,我們可以創建兩種類型的模型。如果用戶輸入被收集、使用然後丟棄,我們應該創建一個表單模型; 如果用戶的輸入被收集後要保存到數據庫,我們應使用一個Active Record。兩種類型的模型共享同樣的基類 CModel ,它定義了表單所需的通用接口。

1、定義模型類

例如創建為一個表單模型:

class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
}

LoginForm 中定義了三個屬性: $username, $password 和 $rememberMe。他們用於保存用戶輸入的用戶名和密碼,還有用戶是否想記住他的登錄的選項。由於 $rememberMe 有一個默認的值 false,相應的選項在初始化顯示在登錄表單中時將是未勾選狀態。

我們將這些成員變量稱為特性(attributes)而不是屬性(properties),以區別於普通的屬性(properties)。特性(attribute)是一個主要用於存儲來自用戶輸入或數據庫數據的屬性(propertiy)。

2、聲明驗證規則

一旦用戶提交了他的輸入,模型被填充,我們就需要在使用前確保用戶的輸入是有效的。這是通過將用戶的輸入和一系列規則執行驗證實現的。我們在 rules() 方法中指定這些驗證規則,此方法應返回一個規則配置數組。

class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
private $_identity;
public function rules()
{
return array(
array('username, password', 'required'), //username 和 password 為必填項
array('rememberMe', 'boolean'), //rememberMe 應該是一個布爾值
array('password', 'authenticate'), //password 應被驗證(authenticated)
);
}
public function authenticate($attribute,$params)
{
$this->_identity=new UserIdentity($this->username,$this->password);
if(!$this->_identity->authenticate())
$this->addError('password','錯誤的用戶名或密碼。');
}
}

rules() 返回的每個規則必須是以下格式:
復制代碼 代碼如下:array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...附加選項)
其中:

AttributeList(特性列表)是需要通過此規則驗證的特性列表字符串,每個特性名字由逗號分隔;
Validator(驗證器) 指定要執行驗證的種類;
on 參數是可選的,它指定此規則應被應用到的場景列表;
附加選項 是一個名值對數組,用於初始化相應驗證器的屬性值。

希望本文所述對大家基於Yii框架的PHP程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved