過濾器
什么是過濾器
過濾器是控制器動作執(zhí)行之前或之后需要執(zhí)行的代碼捉貌。該代碼以對象的形式執(zhí)行昔穴,則應該使用類的方式定義并申明。
過濾器本質上是一種特殊的行為剧蚣。
為什么使用過濾器
通常情況下支竹,過濾器將代碼綁定到所有的操作上,也就是說鸠按,每一個操作的執(zhí)行唾戚,都需要先或后執(zhí)行過濾器,所以待诅,可以用來執(zhí)行權限檢測叹坦、緩存處理等事情
在哪里使用過濾器
在控制器中,定義:
public function behaviors(){
}
過濾器詳解
==behaviors()方法返回一個數組卑雁,類似于配置文件==
數組內的每一個元素也應該是一個數組募书,表示一個過濾器
如:
Public function behaviors(){
Return [
[
‘class’ => ‘實現類’,
]
];
}
表示定義了一個過濾器
過濾器的位置
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í)行的時間
首先應該創(chuàng)建一個過濾器篮赢,比如在frontend 應用中創(chuàng)建一個 filters目錄,專門用來存儲過濾器琉挖,然后創(chuàng)建TimeFilter.php文件過濾器通常使用Filter.php作為文件后綴启泣,而文件中應該有一個和文件名一樣的類
然后覆蓋基礎過濾器的 beforeAction 和 afterAction
在beforAction中,如果返回true表示放行示辈,操作繼續(xù)執(zhí)行寥茫,如果返回false,表示停止矾麻,操作不再執(zhí)行纱耻。
加載過濾器
需要注意的問題:
==定義過濾器內的beforeAction 和 afterAction ,必須返回父類的方法。
Return parent::beforeAction($action)==
錯誤處理
- 凡是非致命錯誤都以異常的形式拋出险耀,是可以捕獲的
- 錯誤處理器是以組件的形式配置在main中的
- 錯誤響應的格式是可以選擇的弄喘,有ajax或者html或者純文本
- 響應錯誤的方法是可以自己定義的
錯誤組件的實質類是yii\web\ErrorHandle其他的配置參數可以去該類中查看public屬性
Session的使用
Cookie的使用
//獲取cookie的對象
$getCookieObj = Yii::$app->request->cookies;
//設置cookie的對象
$setCookieObj = Yii::$app->response->cookies;
/**
* 添加cookie
* 注意:
* 使用add來添加add的參數必須是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 對象甩牺。 結合yii\widgets\ActiveForm和models蘑志,你可以輕松實現安全的上傳文件機制
創(chuàng)建模型
和普通的文本輸入框一樣,創(chuàng)建一個models里的屬性,表示一個字段卖漫,然后完善驗證規(guī)則即可
創(chuàng)建控制器费尽,實例化表單模型和渲染視圖
視圖中使用ActiveForm創(chuàng)建表單元素
在控制器中接收表單數據并綁定數據到表單模型
注意:要調用上傳功能,需要打開 php_fileinfo 擴展
uploads目錄應該在入口文件同級目錄
多文件上傳
Yii2支持多文件上傳羊始,只需要在上面的例子中加入一些小的修改即可
修改表單模型
在驗證中加入 maxFiles 配置表示最多可以上傳多少個文件
修改表單模型的upload 方法
如果是多文件上傳旱幼,這里的$this->imageFile 就會是一個數組,所以可以使用foreach來進行文件保存
視圖文件修改
需要傳入多個文件突委,就需要在表單name屬性加上[] 再加上multiple屬性
控制器修改
控制器接收多個文件柏卤,應該使用UploadedFile 里的getInstances方法來綁定屬性
驗證碼
Yii2中的驗證碼是通過擴展的操作來實現的,叫做
yii\captcha\CaptchaAction
只需要將它綁定到actions中就可以直接訪問匀油,無需任何更改:
可配置的驗證碼屬性
由于驗證碼是一個公共操作缘缚,我們可以很輕松的找到它的實現類。實現類中的各種屬性都可以被認為是可配置的屬性
如:
public $width=120;
還可以設置:
height: 高度
backColor: 背景色
foreColor 文字顏色
minLength 最小長度(文字字數)
maxLength 最大長度
fontFile 字體文件
.....
在視圖中使用驗證碼
使用widget()方法來調用驗證碼模塊敌蚜,并且指定顯示的DOM結構
{image} 表示顯示驗證碼圖片
{input} 顯示驗證碼輸入框
驗證驗證碼
驗證碼在填寫完成之后桥滨,還需要使用驗證機制來完成驗證碼的驗證,在Yii2中弛车,不需要自己去寫驗證齐媒,直接在表單模型的 rules 中調用 captcha 驗證就可以了
['verifyCode','captcha'],
數據分頁
Yii2也提供了類似于TP的數據分頁類:
\yii\data\Pagination
要使用它,需要先進行實例化:
實例化的時候纷跛,需要傳入數據的總條數和每頁顯示的條數
控制器中操作
public function actionList()
{
//獲取頁碼喻括,參數需和Pagination中配置的參數一致
$page=Yii::$app->request->get("page");
$page=($page-1)>0?($page-1):0;
$pageSize=5;
//設置分頁配置
$config=[
'totalCount' => User::find()->count(),
'defaultPageSize' => $pageSize,
'pageParam' => 'page',
];
//實例化分頁器,將配置參數傳入到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;