Yii2 進(jìn)階篇

過濾器

什么是過濾器

過濾器是控制器動作執(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ā)者定義了很多的過濾器,可以直接拿過來使用。

過濾器位置.png

定義過濾器

在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)該有一個和文件名一樣的類

過濾器位置1.png
過濾器.png

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

過濾器應(yīng)用.png

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

加載過濾器

過濾器加載.png

需要注意的問題:
==定義過濾器內(nèi)的beforeAction 和 afterAction ,必須返回父類的方法。
Return parent::beforeAction($action)==

錯誤處理

  1. 凡是非致命錯誤都以異常的形式拋出,是可以捕獲的
  2. 錯誤處理器是以組件的形式配置在main中的
  3. 錯誤響應(yīng)的格式是可以選擇的,有ajax或者h(yuǎn)tml或者純文本
  4. 響應(yīng)錯誤的方法是可以自己定義的
    錯誤組件的實(shí)質(zhì)類是yii\web\ErrorHandle其他的配置參數(shù)可以去該類中查看public屬性

Session的使用

Session使用.png

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)建模型.png

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

創(chuàng)建控制器.png

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

創(chuàng)建元素表單.png

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

表單模型.png

注意:要調(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;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,641評論 19 139
  • Composer 基本用法 // 安裝yii程序 composercreate-project--prefer-d...
    熱過豆腐干閱讀 1,326評論 0 4
  • Sites 網(wǎng)站 yiifeed:Yii 最新動態(tài)都在這里 yiigist:Yii 專用的 Packages my...
    guanguans閱讀 2,694評論 0 11
  • 安裝YII2 在確保composer安裝完成后通過composer安裝YII2 第一條命令為全局安裝一個js的包管...
    某不科學(xué)的XX閱讀 2,290評論 0 2
  • 心心卻無可依,念念卻無可往。 一個秋日的午后,想找一個清靜之地爬爬山,曬曬太陽。經(jīng)當(dāng)?shù)鼐用裢扑],來到這個徽州著名的...
    姀月閱讀 1,094評論 1 2

友情鏈接更多精彩內(nèi)容