《PHP教程:Yii快速入門經典教程》要點:
本文介紹了PHP教程:Yii快速入門經典教程,希望對您有用。如果有疑問,可以聯系我們。
相關主題:YII框架
PHP編程本文講述了Yii快速入門教程.分享給大家供大家參考,具體如下:
PHP編程Ⅰ、基本概念
PHP編程一、入口文件
PHP編程入口文件內容:一般格式如下:
PHP編程 <?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()來拜訪這個實例.
PHP編程二、主配置文件
PHP編程保存位置:你的應用/protected/config/main.php
PHP編程文件內容:一般格式如下:
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'),
);
PHP編程核心應用組件:
PHP編程Yii 預定義了一系列核心應用組件,提供常見 Web 應用中所用的功能.例如, request 組件用于解析用戶哀求并提供例如 URL,cookie 等信息.通過配置這些核心組件的屬性,我們可以幾乎任意的修改Yii 的默認行為.
PHP編程下面我們列出了由 CWebApplication 預定義的核心組件.
PHP編程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 - 管理主題.
PHP編程要拜訪一個應用組件,使用 Yii::app()->組件的ID
PHP編程三、控制器(Controller)
PHP編程控制器 是 CController 類的子類的實例.它在當用戶哀求時由應用創建.當一個控制器運行時,它執行所哀求的動作(控制器類方法),動作通常會引入所必要的模型并渲染相應的視圖.動作,就是一個名字以 action 開頭的控制器類方法(action+大寫首字母的動作名).
PHP編程控制器類文件保存位置protected/controllers/
PHP編程控制器和動作以 ID 識別.
PHP編程控制器ID 是一種 '父目錄/子目錄/控制器名' 的格式,對應相應的控制器類文件 protected/controllers/父目錄/子目錄/大寫首字母的控制器名Controller.php;
PHP編程動作ID 是除去 action 前綴的動作辦法名.
PHP編程1、路由
PHP編程用戶以路由的形式哀求特定的控制器和動作.路由是由控制器 ID 和動作 ID 連接起來的,兩者以斜線分割.
PHP編程例如,路由 post/edit 代表 PostController 及其 edit 動作.默認情況下,URL http://hostname/index.php?r=post/edit 即哀求此控制器和動作.
PHP編程注意: 默認情況下,路由是大小寫敏感的.可以通過設置應用配置中的 CUrlManager::caseSensitive 為 false 使路由對大小寫不敏感.當在大小寫不敏感模式中時, 要確保你遵循了相應的規則約定,即:包含控制器類文件的目錄名小寫,且 控制器映射 和動作映射 中使用的鍵為小寫.
PHP編程路由的格式:控制器ID/動作ID 或 模塊ID/控制器ID/動作ID(如果是嵌套模塊,模塊ID 就是父模塊ID/子模塊ID)
PHP編程2、控制器實例化
PHP編程應用將使用如下規則確定控制器的類以及類文件的位置:
PHP編程① 、如果指定了 CWebApplication::catchAllRequest , 控制器將基于此屬性創建,而用戶指定的控制器 ID 將被忽略.這通常用于將應用設置為維護狀態并顯示一個靜態提示頁面.
PHP編程② 、如果在 CWebApplication::controllerMap 中找到了 ID, 相應的控制器配置將被用于創建控制器實例.
PHP編程③ 、如果 ID 為 'path/to/xyz'的格式,控制器類的名字將判斷為 XyzController,相應的類文件則為 protected/controllers/path/to/XyzController.php.如果類文件不存在,將觸發一個 404 CHttpException 異常.
PHP編程在使用了模塊的情況下,應用將檢查此 ID 是否代表一個模塊中的控制器.如果是的話,模塊實例將被首先創建,然后創建模塊中的控制器實例.
PHP編程3、動作(action)
PHP編程動作 就是被定義為一個以 action 單詞作為前綴命名的方法.而更高級的方式是定義一個動作類并讓控制器在收到哀求時將其實例化.這使得動作可以被復用,提高了可復用度.
PHP編程1、定義一個動作類,基本格式如下:
PHP編程
class UpdateAction extends CAction
{
public function run()
{
// place the action logic here
}
}
PHP編程2、使用動作類:為了讓控制器注意到這個動作,我們要用如下方式覆蓋控制器類的actions() 辦法:
PHP編程
class PostController extends CController
{
public function actions()
{
return array(
'edit'=>'application.controllers.post.UpdateAction', //使用“應用程序文件夾/controllers/post/UpdateAction.php”文件中的類來處理edit動作
);
}
}
PHP編程如上所示,我們使用了路徑別名“application.controllers.post.UpdateAction”指定動作類文件為“protected/controllers/post/UpdateAction.php”.
PHP編程通過編寫基于類的動作,我們可以將應用組織為模塊的風格.例如,如下目錄結構可用于組織控制器相關代碼:
PHP編程protected/
controllers/
PostController.php
UserController.php
post/
CreateAction.php
ReadAction.php
UpdateAction.php
user/
CreateAction.php
ListAction.php
ProfileAction.php
UpdateAction.php
PHP編程4、過濾器(filter)
PHP編程過濾器是一段代碼,可被配置在控制器動作執行之前或之后執行.
PHP編程一個動作可以有多個過濾器.如有多個過濾器,則依照它們出現在過濾器列表中的順序依次執行.過濾器可以阻止動作及后面其他過濾器的執行.
PHP編程過濾器可以定義為一個控制器類的辦法.過濾器辦法名必須以 filter 開頭.例如,現有的 filterAccessControl 辦法定義了一個名為 accessControl 的過濾器.過濾器辦法必須為如下結構:
PHP編程
public function filterAccessControl($filterChain)
{
// 調用 $filterChain->run() 以繼續后續過濾器與動作的執行.
}
PHP編程$filterChain (過濾器鏈)是一個 CFilterChain 的實例,代表與所哀求動作相關的過濾器列表.在過濾器方法中,我們可以調用 $filterChain->run() 以繼續執行后續過濾器和動作.
PHP編程如 動作 一樣,過濾器也可以是一個對象,它是 CFilter 或其子類的實例.如下代碼定義了一個新的過濾器類:
PHP編程
class PerformanceFilter extends CFilter
{
protected function preFilter($filterChain)
{
// 動作被執行之前應用的邏輯
return true; // 如果動作不應被執行,此處返回 false
}
protected function postFilter($filterChain)
{
// 動作執行之后應用的邏輯
}
}
PHP編程要對動作應用過濾器,我們需要覆蓋 CController::filters() 辦法.此辦法應返回一個過濾器配置數組.例如:
PHP編程
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
),
);
}
}
PHP編程上述代碼指定了兩個過濾器: postOnly 和 PerformanceFilter. postOnly 過濾器是基于辦法的(相應的過濾器辦法已在 CController 中定義);而 performanceFilter 過濾器是基于對象的.路徑別名 application.filters.PerformanceFilter 指定過濾器類文件是 protected/filters/PerformanceFilter.我們使用一個數組配置 PerformanceFilter ,這樣它就可被用于初始化過濾器對象的屬性值.此處 PerformanceFilter 的 unit 屬性值將被初始為 second.
PHP編程使用加減號,我們可指定哪些動作應該或不應該應用過濾器.上述代碼中, postOnly 應只被應用于 edit 和 create 動作,而 PerformanceFilter 應被應用于 除了 edit 和 create 之外的動作.如果過濾器配置中沒有使用加減號,則此過濾器將被應用于所有動作.
PHP編程五、模型(Model)
PHP編程模型是 CModel 或其子類的實例.模型用于保持數據以及與其相關的業務邏輯.
PHP編程模型是單獨的數據對象.它可以是數據表中的一行,或者一個用戶輸入的表單.
PHP編程數據對象的每個字段對應模型中的一個屬性.每個屬性有一個標簽(label),并且可以通過一系列規則進行驗證.
PHP編程Yii 實現了兩種類型的模型:表單模型和 Active Record.二者均繼承于相同的基類 CModel.
PHP編程表單模型是 CFormModel 的實例.表單模型用于保持從用戶的輸入獲取的數據.這些數據經常被獲取,使用,然后丟棄.例如,在一個登錄頁面中,我們可以使用表單模型用于表示由最終用戶提供的用戶名和暗碼信息.
PHP編程Active Record (AR) 是一種用于通過面向對象的風格抽象化數據庫拜訪的設計模式.每個 AR 對象是一個 CActiveRecord 或其子類的實例.代表數據表中的一行.行中的字段對應 AR 對象中的屬性.
PHP編程六、視圖
PHP編程視圖是一個包含了主要的用戶交互元素的PHP腳本.
PHP編程視圖有一個名字,當渲染(render)時,名字會被用于識別視圖腳本文件.視圖的名稱與其視圖腳本名稱是一樣的.例如:視圖 edit 的名稱出自一個名為 edit.php 的腳本文件.要渲染時,需通過傳遞視圖的名稱調用 CController::render().這個辦法將在“protected/views/控制器ID”目錄下尋找對應的視圖文件.
PHP編程在視圖腳本內部,我們可以通過 $this 來拜訪控制器實例.我們可以在視圖里以“$this->屬性名”的方式獲取控制器的任何屬性.
PHP編程我們也可以用以下 推送 的方式傳遞數據到視圖里:
PHP編程
$this->render('edit', array(
'var1'=>$value1,
'var2'=>$value2,
));
PHP編程在以上的方式中, render() 方法將提取數組的第二個參數到變量里.其產生的結果是,在視圖腳本里,我們可以直接拜訪變量 $var1 和 $var2.
PHP編程1、布局
PHP編程布局是一種用來修飾視圖的特殊的視圖文件.它通常包含了用戶界面中通用的一部分視圖.例如:布局可以包含header和footer的部分,然后把內容嵌入其間.
PHP編程
......header here......
<?php echo $content; ?>
......footer here......
PHP編程其中的 $content 則儲存了內容視圖的渲染結果.
PHP編程當使用render()時,布局被隱式應用.視圖腳本 protected/views/layouts/main.php 是默認的布局文件.這可以通過改變 CWebApplication::layout 進行自定義.要渲染一個不帶布局的視圖,則需調用 renderPartial() .
PHP編程2、小物件
PHP編程小物件是 CWidget 或其子類的實例.它是一個主要用于表現數據的組件.小物件通常內嵌于一個視圖來產生一些復雜而獨立的用戶界面.例如,一個日歷小物件可用于渲染一個復雜的日歷界面.小物件使用戶界面更加可復用.
PHP編程我們可以按如下視圖腳本來使用一個小物件:
PHP編程
<?php $this->beginWidget('小物件類的路徑別名'[,'包含屬性初始化值的數組']); ?>
...可能會由小物件獲取的內容主體...
<?php $this->endWidget(); ?>
PHP編程或者
PHP編程
<?php $this->widget('小物件類的路徑別名'[,'包含屬性初始化值的數組']); ?>
PHP編程后者用于不需要任何 body 內容的組件.
PHP編程小物件可通過配置來定制它的表現.這是通過調用 CBaseController::beginWidget 或 CBaseController::widget 設置其初始化屬性值來完成的.
PHP編程我們通過傳遞一個攜帶這些屬性初始化值的數組來實現,該數組的鍵是屬性的名稱,而數組的值則是小物件屬性所對應的值.如下所示 :
PHP編程
<?php
$this->widget('CMaskedTextField',array(
'mask'=>'99/99/9999'
));
?>
PHP編程繼承 CWidget 并覆蓋其init()和run()辦法,可以定義一個新的小物件:
PHP編程
class MyWidget extends CWidget
{
public function init()
{
// 此辦法會被 CController::beginWidget() 調用
}
public function run()
{
// 此辦法會被 CController::endWidget() 調用
}
}
PHP編程小物件可以像一個控制器一樣擁有它自己的視圖.
PHP編程默認情況下,小物件的視圖文件位于包含了小物件類文件目錄的 views 子目錄之下(protected/components/views).這些視圖可以通過調用CWidget::render()渲染,這一點和控制器很相似.唯一不同的是,小物件的視圖沒有布局文件支持.另外,小物件視圖中的$this指向小物件實例而不是控制器實例.
PHP編程3、系統視圖
PHP編程系統視圖的渲染通常用于展示 Yii 的錯誤和日志信息.
PHP編程系統視圖的命名遵從了一些規則.比如像“errorXXX”這樣的名稱就是用于渲染展示錯誤號XXX的 CHttpException 的視圖.例如,如果 CHttpException 拋出一個404錯誤,那么 error404 就會被顯示.
PHP編程在 framework/views 下, Yii 提供了一系列默認的系統視圖. 他們可以通過在 protected/views/system 下創建同名視圖文件進行自定義.
PHP編程七、組件
PHP編程Yii 應用建立于組件之上.組件是 CComponent 或其子類的實例.使用組件主要涉及拜訪它的屬性以及觸發或處理它的時間.基類 CComponent 指定了如何定義屬性和事件.
PHP編程1、組件屬性
PHP編程組件的屬性就像對象的公共成員變量.它是可讀寫的.
PHP編程要定義一個組件屬性,我們只需在組件類中定義一個公共成員變量即可.
PHP編程更靈活的方式是定義其 getter 和 setter 辦法,例如:
PHP編程
public function getTextWidth() // 獲取 textWidth 屬性
{
return $this->_textWidth;
}
public function setTextWidth($value) // 設置 TextWidth 屬性
{
$this->_textWidth=$value;
}
PHP編程上述代碼定義了一個可寫的屬性名為 textWidth(名字是大小寫不敏感的).當讀取屬性時,getTextWidth() 就會被調用,其返回值則成為屬性值;相似的,當寫入屬性時,setTextWidth() 被調用.如果 setter 辦法沒有定義,則屬性將是只讀的,如果對其寫入則會拋出一個異常.使用 getter 和 setter 辦法定義一個屬性有一個好處:即當讀取或寫入屬性時,可以執行額外的邏輯(例如,執行驗證,觸發事件).
PHP編程注意: 通過 getter/setter 定義的屬性和類成員變量之間有一個細微的差異:屬性的名字是大小寫不敏感的, 而 類成員變量是大小寫敏感的.
PHP編程2、組件事件
PHP編程組件事件是一些特殊的屬性,它們使用一些稱作 事件句柄(event handlers)的辦法作為其值.分配一個辦法到一個事件將會引起辦法在事件被喚起處自動被調用.因此,一個組件的行為可能會被一種在部件開發過程中不可預見的方式修改.
組件事件以 on 開頭的命名方式定義.和屬性通過 getter/setter 辦法來定義的命名方式一樣,事件的名稱是大小寫不敏感的.以下代碼定義了一個 onClicked 事件:
PHP編程
public function onClicked($event)
{
$this->raiseEvent('onClicked', $event);
}
PHP編程這里作為事件參數的 $event 是 CEvent 或其子類的實例.
PHP編程我們可以分配一個辦法到此事件,如下所示:
PHP編程事件句柄的結構如下:
PHP編程
function 辦法名($event)
{
......
}
PHP編程這里的 $event 即描述事件的參數(它來源于 raiseEvent() 調用).$event 參數是 CEvent 或其子類的實例.至少,它包含了關于誰觸發了此事件的信息.
PHP編程事件句柄也可以是一個PHP 5.3以后支持的匿名函數.例如:
PHP編程
$component->onClicked=function($event) {
......
}
PHP編程如果我們現在調用 onClicked(),onClicked 事件將被觸發(在 onClicked() 中),附屬的事件句柄將被自動調用.
PHP編程一個事件可以綁定多個句柄.當事件觸發時,這些句柄將被依照它們綁定到事件時的順序依次執行.如果句柄決定組織后續句柄被執行,它會設置 $event->handled 為 true.
PHP編程3、組件行為
PHP編程組件已添加了對 mixin 的支持,并可以綁定一個或多個行為.行為是一個對象,其辦法可以被它綁定的部件通過收集功能的方式來實現繼承(inherited),而不是專有化繼承(即普通的類繼承).一個部件可以以'多重繼承'的方式實現多個行為的綁定.
PHP編程行為類必須實現 IBehavior 接口. 大多數行為可以繼承自 CBehavior .如果一個行為需要綁定到一個模型, 它也可以從專為模型實現綁定特性的 CModelBehavior 或 CActiveRecordBehavior 繼承.
PHP編程要使用一個行為,它必須首先通過調用此行為的 attach() 辦法綁定到一個組件.然后我們就可以通過組件調用此行為辦法:
PHP編程
// $name 在組件中實現了對行為的唯一識別
$component->attachBehavior($name,$behavior);
// test() 是行為中的方法.
$component->test();
PHP編程已綁定的行為可以像一個組件中的普通屬性一樣拜訪.例如,如果一個名為 tree 的行為綁定到了一個組件,我們就可以通過如下代碼獲得指向此行為的引用.
PHP編程
$behavior=$component->tree;
// 等于下行代碼:
// $behavior=$component->asa('tree');
PHP編程行為是可以被臨時禁止的,此時它的辦法就會在組件中失效.例如:
PHP編程
$component->disableBehavior($name);
// 下面的代碼將拋出一個異常
$component->test();
$component->enableBehavior($name);
// 現在就可以使用了
$component->test();
PHP編程兩個同名行為綁定到同一個組件下是有可能的.在這種情況下,先綁定的行為則擁有優先權.
PHP編程當和 events, 一起使用時,行為會更加強大.當行為被綁定到組件時,行為里的一些辦法就可以綁定到組件的一些事件上了.這樣一來,行為就有機觀察或者改變組件的常規執行流程.
PHP編程一個行為的屬性也可以通過綁定到的組件來拜訪.這些屬性包含公共成員變量以及通過 getters 和/或 setters 方式設置的屬性.例如, 若一個行為有一個 xyz 的屬性,此行為被綁定到組件 $a,然后我們可以使用表達式 $a->xyz 拜訪此行為的屬性.
PHP編程八、模塊
PHP編程模塊是一個獨立的軟件單元,它包含 模型, 視圖, 控制器 和其他支持的組件.在許多方面上,模塊看起來像一個應用.主要的區別就是模塊不能單獨部署,它必須存在于一個應用里.用戶可以像他們拜訪普通應用的控制器那樣拜訪模塊中的控制器.
PHP編程模塊在一些場景里很有用.對大型應用來說,我們可能需要把它劃分為幾個模塊,每個模塊可以單獨維護和部署.一些通用的功能,例如用戶管理,評論管理,可以以模塊的形式開發,這樣他們就可以容易地在以后的項目中被復用.
PHP編程1、創建模塊
PHP編程模塊組織在一個目錄中,目錄名即為模塊的唯一ID.模塊目錄的結構跟 應用基礎目錄 很相似.下面列出了一個 fourm 的模塊的典型的目錄結構:
PHP編程forum/ 模塊文件夾
ForumModule.php 模塊類文件
components/ 包含可復用的用戶組件
views/ 包含小物件的視圖文件
controllers/ 包含控制器類文件
DefaultController.php 默認的控制器類文件
extensions/ 包含第三方擴展
models/ 包含模型類文件
views/ 包含控制器視圖和布局文件
layouts/ 包含布局文件
default/ 包含 DefaultController 的視圖文件
index.php 首頁視圖文件
PHP編程模塊必須有一個繼承自 CWebModule 的模塊類.類的名字通過表達式 ucfirst($id).'Module' 確定, 其中的 $id 代表模塊的 ID (或者說模塊的目錄名字).模塊類是存儲模塊代碼間可共享信息的中心位置.例如,我們可以使用 CWebModule::params 存儲模塊參數,使用 CWebModule::components 分享模塊級的應用組件.
PHP編程2、使用模塊
PHP編程要使用模塊,首先將模塊目錄放在 應用基礎目錄的modules文件夾中.然后在應用的modules屬性中聲明模塊ID.例如,為了使用上面的forum模塊,我們可以使用如下應用配置:
PHP編程
return array(
......
'modules'=>array('forum',...),
......
);
PHP編程模塊也可以在配置時帶有初始屬性值.做法和配置 應用組件 很類似.例如, forum 模塊可以在其模塊類中有一個名為 postPerPage 的屬性,它可以在 應用配置 中配置如下:
PHP編程
return array(
......
'modules'=>array(
'forum'=>array(
'postPerPage'=>20,
),
),
......
);
PHP編程模塊的實例可通過當前活動控制器的 module 屬性拜訪.在模塊實例中,我們可以拜訪在模塊級中共享的信息.例如,為拜訪上面的 postPerPage 信息,我們可使用如下表達式:
PHP編程
$postPerPage=Yii::app()->controller->module->postPerPage;
// 如如$this引用的是控制器實例,則可以使用下行語句
// $postPerPage=$this->module->postPerPage;
PHP編程模塊中的控制器動作可以通過路由“模塊ID/控制器ID/動作ID”或“模塊ID/存放控制器類文件的子目錄名/控制器ID/動作ID”拜訪.例如,假設上面的 forum 模塊有一個名為 PostController 的控制器,我們就可以通過路由 forum/post/create 拜訪此控制器中的 create 動作.此路由對應的 URL 即 http://www.example.com/index.php?r=forum/post/create.
PHP編程3、嵌套的模塊
PHP編程模塊可以無限級嵌套.這就是說,一個模塊可以包含另一個模塊,而這另一個模塊又可以包含其他模塊.我們稱前者為 父模塊 ,后者為子模塊.子模塊必須定義在其父模塊的 modules 屬性中,就像我們前面在應用配置中定義模塊一樣.
PHP編程要拜訪子模塊中的控制器動作,我們應使用路由 父模塊ID/子模塊ID/控制器ID/動作ID.
PHP編程九、路徑別名
PHP編程Yii 中廣泛的使用了路徑別名.路徑別名關聯于一個目錄或文件的路徑.它以點號語法指定,類似于廣泛使用的名字空間(namespace)格式:
PHP編程RootAlias.path.to.target
PHP編程其中的 RootAlias 是某個現存目錄的別名,通過調用 YiiBase::setPathOfAlias(), 我們可以定義新的路徑別名.為方便起見,Yii 預定義了以下幾個根別名:
PHP編程system: 表示 Yii 框架目錄;
zii: 表示 Zii 庫 目錄;
application: 表示應用的 基礎目錄;
webroot: 表示 入口腳本 文件所在的目錄.
ext: 表示包含了所有第三方 擴展 的目錄.
PHP編程額外的,如果應用使用了 模塊, (Yii) 也為每個模塊ID定義了根別名,指向相應模塊的跟目錄.
PHP編程通過使用 YiiBase::getPathOfAlias(), 別名可以被翻譯為其相應的路徑.
PHP編程使用別名可以很方便的導入類的定義.例如,如果我們想包含 CController 類的定義,我們可以調用如下代碼
PHP編程我們還可以使用如下語法導入整個目錄,這樣此目錄下的類文件就會在需要時被自動包含.
PHP編程不要將路徑別名和名字空間混淆了,名字空間是指對一些類名的一個邏輯組合,這樣它們就可以相互區分開,即使有相同的名字.而路徑別名是用于指向一個類文件或目錄.路徑別名與名字空間并不沖突.
PHP編程十、開發規范
PHP編程下面我們講解 Yii 編程中推薦的開發規范.為簡單起見,我們假設 WebRoot 是 Yii 應用安裝的目錄.
PHP編程1、URL
PHP編程默認情況下,Yii 識別如下格式的 URL:
http://hostname/index.php?r=ControllerID/ActionID
PHP編程r 變量意為 路由(route) ,它可以被Yii解析為 控制器和動作.如果 ActionID 被省略,控制器將使用默認的動作(在CController::defaultAction中定義);如果 ControllerID 也被省略(或者 r 變量不存在),應用將使用默認的控制器(在CWebApplication::defaultController中定義).
PHP編程通過 CUrlManager 的贊助,可以創建更加可識別,更加 SEO 友好的 URL,例如 http://hostname/ControllerID/ActionID.html.
PHP編程2、代碼
PHP編程Yii 推薦命名變量、函數和類時使用駝峰風格,即每個單詞的首字母大寫并連在一起,中間無空格.變量名和函數名應該使它們的第一個單詞全部小寫,以使其區別于類名.對私有類成員變量來說,我們推薦以下劃線作為其名字前綴(例如: $_actionList).
PHP編程一個針對控制器類名的特殊規則是它們必須以單詞 Controller 結尾.那么控制器ID就是類名的首字母小寫并去掉單詞Controller.例如,PageController類的ID就是 page.這個規則使應用更加平安.它還使控制器相關的URL更加簡單(例如 /index.php?r=page/index 而不是 /index.php?r=PageController/index).
PHP編程3、配置
PHP編程配置是一個鍵值對數組.每個鍵代表了所配置的對象中的屬性名,每個值則為相應屬性的初始值.
PHP編程類中任何可寫的屬性都可以被配置.如果沒有配置,屬性將使用它們的默認值.當配置一個屬性時,最好閱讀相應文檔以保證初始值正確.
PHP編程4、文件
PHP編程命名和使用文件的規范取決于它們的類型.
PHP編程類文件應以它們包含的公有類命名.例如,CController 類位于 CController.php 文件中.公有類是可以被任何其他類使用的類.每個類文件應包含最多一個公有類.私有類(只能被一個公有類使用的類)可以放在使用此類的公有類所在的文件中.
PHP編程視圖文件應以視圖的名字命名.例如, index 視圖位于 index.php 文件中.視圖文件是一個PHP腳本文件,它包含了用于呈現內容的HTML和PHP代碼.
PHP編程配置文件可以任意命名.配置文件是一個PHP腳本,它的主要目的是返回一個體現配置的關聯數組.
PHP編程5、目錄
PHP編程Yii 假定了一系列默認的目錄用于不同的場合.如果需要,每個目錄都可以自定義.
PHP編程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 自定義.
PHP編程6、數據庫
PHP編程多數Web 應用是由數據庫驅動的.我們推薦在對表和列命名時使用如下命名規范.注意,這些規范并不是 Yii 所必須的.
PHP編程㈠數據庫表名和列名都使用小寫命名.
㈡名字中的單詞應使用下劃線分割 (例如 product_order).
㈢對于表名,你既可以使用單數也可以使用復數.但不要 同時使用兩者.為簡單起見,我們推薦使用單數名字.
㈣表名可以使用一個通用前綴,例如 tbl_ .這樣當應用所使用的表和另一個應用說使用的表共存于同一個數據庫中時就特別有用.這兩個應用的表可以通過使用不同的表前綴很容易地區別開.
PHP編程Ⅱ、使用表單
PHP編程在 Yii 中處理表單時,通常需要以下步驟:
PHP編程1. 創建用于表現所要收集數據字段的模型類.
2. 創建一個控制器動作,響應表單提交.
3. 在視圖腳本中創建與控制器動作相關的表單.
PHP編程一、創建模型
PHP編程在編寫表單所需的 HTML 代碼之前,我們應該先確定來自最終用戶輸入的數據的類型,以及這些數據應符合什么樣的規則.模型類可用于記錄這些信息.正如模型章節所定義的,模型是保存用戶輸入和驗證這些輸入的中心位置.
PHP編程取決于使用用戶所輸入數據的方式,我們可以創建兩種類型的模型.如果用戶輸入被收集、使用然后丟棄,我們應該創建一個表單模型; 如果用戶的輸入被收集后要保存到數據庫,我們應使用一個Active Record.兩種類型的模型共享同樣的基類 CModel ,它定義了表單所需的通用接口.
PHP編程1、定義模型類
PHP編程例如創建為一個表單模型:
PHP編程
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
}
PHP編程LoginForm 中定義了三個屬性: $username, $password 和 $rememberMe.他們用于保存用戶輸入的用戶名和暗碼,還有用戶是否想記住他的登錄的選項.由于 $rememberMe 有一個默認的值 false,相應的選項在初始化顯示在登錄表單中時將是未勾選狀態.
PHP編程我們將這些成員變量稱為特性(attributes)而不是屬性(properties),以區別于普通的屬性(properties).特性(attribute)是一個主要用于存儲來自用戶輸入或數據庫數據的屬性(propertiy).
PHP編程2、聲明驗證規則
PHP編程一旦用戶提交了他的輸入,模型被填充,我們就需要在使用前確保用戶的輸入是有效的.這是通過將用戶的輸入和一系列規則執行驗證實現的.我們在 rules() 辦法中指定這些驗證規則,此辦法應返回一個規則配置數組.
PHP編程
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','錯誤的用戶名或暗碼.');
}
}
PHP編程rules() 返回的每個規則必須是以下格式:
PHP編程AttributeList(特性列表)是需要通過此規則驗證的特性列表字符串,每個特性名字由逗號分隔;
Validator(驗證器) 指定要執行驗證的種類;
on 參數是可選的,它指定此規則應被應用到的場景列表;
附加選項 是一個名值對數組,用于初始化相應驗證器的屬性值.
PHP編程希望本文所述對大家基于Yii框架的PHP程序設計有所贊助.
歡迎參與《PHP教程:Yii快速入門經典教程》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7968.html