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

Yii快速入門基礎教程

編輯:PHP基礎知識
 

Ⅰ、基本概念
一、入口文件
入口文件內容:一般格式如下:
<?php

$yii=dirname(__FILE__).'/../../framework/yii.php';//Yii框架位置
$config=dirname(__FILE__).'/protected/config/main.php';//當前應用程序的主配置文件位置

// 部署正式環境時,去掉下面這行
// defined('YII_DEBUG') ordefine('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、控制器實例化
應用將使用如下規則確定控制器的類以及類文件的位置:
1、如果指定了 CWebApplication::catchAllRequest , 控制器將基於此屬性創建,而用戶指定的控制器 ID將被忽略。這通常用於將應用設置為維護狀態並顯示一個靜態提示頁面。
2、如果在 CWebApplication::controllerMap 中找到了 ID,相應的控制器配置將被用於創建控制器實例。
3、如果 ID 為 'path/to/xyz'的格式,控制器類的名字將判斷為 XyzController,相應的類文件則為protected/controllers/path/to/XyzController.php。如果類文件不存在,將觸發一個 404CHttpException 異常。
在使用了模塊的情況下,應用將檢查此 ID是否代表一個模塊中的控制器。如果是的話,模塊實例將被首先創建,然後創建模塊中的控制器實例。
3、動作(action)
動作 就是被定義為一個以 action單詞作為前綴命名的方法。而更高級的方式是定義一個動作類並讓控制器在收到請求時將其實例化。這使得動作可以被復用,提高了可復用度。
1、定義一個動作類,基本格式如下:
class UpdateAction extends CAction
{
publicfunction run()
{
// place the action logic here
}
}
2、使用動作類:為了讓控制器注意到這個動作,我們要用如下方式覆蓋控制器類的actions() 方法:
class PostController extends CController
{
publicfunction 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
四、過濾器(filter)
過濾器是一段代碼,可被配置在控制器動作執行之前或之後執行。
一個動作可以有多個過濾器。如有多個過濾器,則按照它們出現在過濾器列表中的順序依次執行。過濾器可以阻止動作及後面其他過濾器的執行。
過濾器可以定義為一個控制器類的方法。過濾器方法名必須以 filter 開頭。例如,現有的 filterAccessControl方法定義了一個名為 accessControl 的過濾器。過濾器方法必須為如下結構:
public function filterAccessControl($filterChain)
{
// 調用$filterChain->run() 以繼續後續過濾器與動作的執行。
}
$filterChain (過濾器鏈)是一個 CFilterChain 的實例,代表與所請求動作相關的過濾器列表。在過濾器方法中,我們可以調用$filterChain->run() 以繼續執行後續過濾器和動作。
如 動作 一樣,過濾器也可以是一個對象,它是 CFilter 或其子類的實例。如下代碼定義了一個新的過濾器類:
class PerformanceFilter extends CFilter
{
protectedfunction preFilter($filterChain)
{
// 動作被執行之前應用的邏輯
return true; // 如果動作不應被執行,此處返回 false
}

protectedfunction postFilter($filterChain)
{
// 動作執行之後應用的邏輯
}
}

要對動作應用過濾器,我們需要覆蓋 CController::filters()方法。此方法應返回一個過濾器配置數組。例如:
class PostController extends CController
{
......
publicfunction 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之外的動作。如果過濾器配置中沒有使用加減號,則此過濾器將被應用於所有動作。  

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