過濾器
什么是過濾器
過濾器是控制器動作執(zhí)行之前或之后需要執(zhí)行的代碼。該代碼以對象的形式執(zhí)行,則應(yīng)該使用類的方式定義并申明。
過濾器本質(zhì)上是一種特殊的行為。
為什么使用過濾器
通常情況下,過濾器將代碼綁定到所有的操作上,也就是說,每一個操作的執(zhí)行,都需要先或后執(zhí)行過濾器,所以,可以用來執(zhí)行權(quán)限檢測、緩存處理等事情
在哪里使用過濾器
在控制器中,定義:
public function behaviors(){
}
過濾器詳解
==behaviors()方法返回一個數(shù)組,類似于配置文件==
數(shù)組內(nèi)的每一個元素也應(yīng)該是一個數(shù)組,表示一個過濾器
如:
Public function behaviors(){
Return [
[
‘class’ => ‘實(shí)現(xiàn)類’,
]
];
}
表示定義了一個過濾器
過濾器的位置
Yii2為開發(fā)者定義了很多的過濾器,可以直接拿過來使用。

定義過濾器
在Yii2中,自定義過濾器,需要繼承 yii\base\ActionFilter 類并覆蓋 yii\base\ActionFilter::beforeAction() 和/或 yii\base\ActionFilter::afterAction() 方法來創(chuàng)建動作的過濾器
定義在beforeAction()中的代碼會在操作執(zhí)行之前執(zhí)行
定義在afterAction()中的代碼會在操作執(zhí)行之后執(zhí)行
如:創(chuàng)建一個過濾器,記錄操作執(zhí)行的時間
首先應(yīng)該創(chuàng)建一個過濾器,比如在frontend 應(yīng)用中創(chuàng)建一個 filters目錄,專門用來存儲過濾器,然后創(chuàng)建TimeFilter.php文件過濾器通常使用Filter.php作為文件后綴,而文件中應(yīng)該有一個和文件名一樣的類


然后覆蓋基礎(chǔ)過濾器的 beforeAction 和 afterAction

在beforAction中,如果返回true表示放行,操作繼續(xù)執(zhí)行,如果返回false,表示停止,操作不再執(zhí)行。
加載過濾器

需要注意的問題:
==定義過濾器內(nèi)的beforeAction 和 afterAction ,必須返回父類的方法。
Return parent::beforeAction($action)==
錯誤處理
- 凡是非致命錯誤都以異常的形式拋出,是可以捕獲的
- 錯誤處理器是以組件的形式配置在main中的
- 錯誤響應(yīng)的格式是可以選擇的,有ajax或者h(yuǎn)tml或者純文本
- 響應(yīng)錯誤的方法是可以自己定義的
錯誤組件的實(shí)質(zhì)類是yii\web\ErrorHandle其他的配置參數(shù)可以去該類中查看public屬性
Session的使用

Cookie的使用
//獲取cookie的對象
$getCookieObj = Yii::$app->request->cookies;
//設(shè)置cookie的對象
$setCookieObj = Yii::$app->response->cookies;
/**
* 添加cookie
* 注意:
* 使用add來添加add的參數(shù)必須是yii\web\Cookie對象
*/
$setCookieObj->add(new Cookie([
'name' => 'tel',
'value' => '15730436354',
'expire' => time()+20
]));
/**
* 獲取值時有三種方法
*/
//獲取的是cookie的值
var_dump($getCookieObj->getValue('tel', '00000'));
//獲取的是對象
var_dump($getCookieObj->get('tel'));
//獲取的是對象
var_dump($getCookieObj['tel']);
文件上傳
在Yii里上傳文件通常使用yii\web\UploadedFile類, 它把每個上傳的文件封裝成 UploadedFile 對象。 結(jié)合yii\widgets\ActiveForm和models,你可以輕松實(shí)現(xiàn)安全的上傳文件機(jī)制
創(chuàng)建模型
和普通的文本輸入框一樣,創(chuàng)建一個models里的屬性,表示一個字段,然后完善驗(yàn)證規(guī)則即可

創(chuàng)建控制器,實(shí)例化表單模型和渲染視圖

視圖中使用ActiveForm創(chuàng)建表單元素

在控制器中接收表單數(shù)據(jù)并綁定數(shù)據(jù)到表單模型

注意:要調(diào)用上傳功能,需要打開 php_fileinfo 擴(kuò)展
uploads目錄應(yīng)該在入口文件同級目錄
多文件上傳
Yii2支持多文件上傳,只需要在上面的例子中加入一些小的修改即可
修改表單模型
在驗(yàn)證中加入 maxFiles 配置表示最多可以上傳多少個文件
修改表單模型的upload 方法
如果是多文件上傳,這里的$this->imageFile 就會是一個數(shù)組,所以可以使用foreach來進(jìn)行文件保存
視圖文件修改
需要傳入多個文件,就需要在表單name屬性加上[] 再加上multiple屬性
控制器修改
控制器接收多個文件,應(yīng)該使用UploadedFile 里的getInstances方法來綁定屬性
驗(yàn)證碼
Yii2中的驗(yàn)證碼是通過擴(kuò)展的操作來實(shí)現(xiàn)的,叫做
yii\captcha\CaptchaAction
只需要將它綁定到actions中就可以直接訪問,無需任何更改:
可配置的驗(yàn)證碼屬性
由于驗(yàn)證碼是一個公共操作,我們可以很輕松的找到它的實(shí)現(xiàn)類。實(shí)現(xiàn)類中的各種屬性都可以被認(rèn)為是可配置的屬性
如:
public $width=120;
還可以設(shè)置:
height: 高度
backColor: 背景色
foreColor 文字顏色
minLength 最小長度(文字字?jǐn)?shù))
maxLength 最大長度
fontFile 字體文件
.....
在視圖中使用驗(yàn)證碼
使用widget()方法來調(diào)用驗(yàn)證碼模塊,并且指定顯示的DOM結(jié)構(gòu)
{image} 表示顯示驗(yàn)證碼圖片
{input} 顯示驗(yàn)證碼輸入框
驗(yàn)證驗(yàn)證碼
驗(yàn)證碼在填寫完成之后,還需要使用驗(yàn)證機(jī)制來完成驗(yàn)證碼的驗(yàn)證,在Yii2中,不需要自己去寫驗(yàn)證,直接在表單模型的 rules 中調(diào)用 captcha 驗(yàn)證就可以了
['verifyCode','captcha'],
數(shù)據(jù)分頁
Yii2也提供了類似于TP的數(shù)據(jù)分頁類:
\yii\data\Pagination
要使用它,需要先進(jìn)行實(shí)例化:
實(shí)例化的時候,需要傳入數(shù)據(jù)的總條數(shù)和每頁顯示的條數(shù)
控制器中操作
public function actionList()
{
//獲取頁碼,參數(shù)需和Pagination中配置的參數(shù)一致
$page=Yii::$app->request->get("page");
$page=($page-1)>0?($page-1):0;
$pageSize=5;
//設(shè)置分頁配置
$config=[
'totalCount' => User::find()->count(),
'defaultPageSize' => $pageSize,
'pageParam' => 'page',
];
//實(shí)例化分頁器,將配置參數(shù)傳入到Pagination中
$paginationObj = new Pagination($config);
$rows =User::find()->asArray()->offset($page*$pageSize)->limit($pageSize)->all();
return $this->render('list',[
'rows'=>$rows,
'pagebar' => $paginationObj
]);
}
視圖中操作
在視圖中要顯示分頁,要使用到LinkPager 小部件
使用方法:
<?=\yii\widgets\LinkPager::widget([
'pagination' => $pagebar
]) ?>
需要傳入一個 pagination 對象,也就是 $pages;