1. 程式人生 > >Yii2 應用結構 過濾器之核心過濾器

Yii2 應用結構 過濾器之核心過濾器

測試程式碼:

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['index', 'view'],
                //'except' => ['test'],         //在該過濾器中不執行該動作
                'rules' => [
                    [
                        'allow'
=> true, //yii\filters\AccessRule::allow: 指定該規則是 "允許" 還是 "拒絕" 。(譯者注:true是允許,false是拒絕) 'actions' => ['index'], //yii\filters\AccessRule::actions:指定該規則用於匹配哪些操作。 它的值應該是操作方法的ID陣列。匹配比較是大小寫敏感的。如果該選項為空,或者不使用該選項, 意味著當前規則適用於所有的操作。 //yii\filters\AccessRule::controllers:指定該規則用於匹配哪些控制器。 它的值應為控制器ID陣列。匹配比較是大小寫敏感的。如果該選項為空,或者不使用該選項, 則意味著當前規則適用於所有的操作。(譯者注:這個選項一般是在控制器的自定義父類中使用才有意義)
//yii\filters\AccessRule::roles:指定該規則用於匹配哪些使用者角色。 系統自帶兩個特殊的角色,通過 yii\web\User::isGuest 來判斷: //?: 用於匹配訪客使用者 (未經認證) //@: 用於匹配已認證使用者 //使用其他角色名時,將觸發呼叫 yii\web\User::can(),這時要求 RBAC 的支援 (在下一節中闡述)。 如果該選項為空或者不使用該選項,意味著該規則適用於所有角色。
'roles' => ['?'], //roles 選項包含的問號 ? 是一個特殊的標識,代表”訪客使用者”。 //@是另一個特殊標識, 代表”已認證使用者”。 //yii\filters\AccessRule::ips:指定該規則用於匹配哪些 yii\web\Request::userIP 。 IP 地址可在其末尾包含萬用字元 * 以匹配一批字首相同的IP地址。 例如,192.168.* 匹配所有 192.168. 段的IP地址。 如果該選項為空或者不使用該選項,意味著該規則適用於所有角色。 'ips' => ['*'], //yii\filters\AccessRule::verbs:指定該規則用於匹配哪種請求方法(例如GET,POST)。 這裡的匹配大小寫不敏感。 'verbs' => ['GET','POST'], //yii\filters\AccessRule::matchCallback:指定一個PHP回撥函式用於 判定該規則是否滿足條件。(譯者注:此處的回撥函式是匿名函式) 'matchCallback' => function ($rule, $action) { ///echo "判斷是否滿足條件....."; //return true; return false; //return date('d-m') === '07-16'; }, //yii\filters\AccessRule::denyCallback: 指定一個PHP回撥函式, 當這個規則不滿足條件時該函式會被呼叫。(譯者注:此處的回撥函式是匿名函式) 'denyCallback' => function ($rule, $action) { //throw new \Exception('You are not allowed to access this page'); //echo "不滿足條件時執行denyCallback......"; //die(); return "不滿足條件時執行denyCallback。。。。。。"; } ], [ 'allow' => true, 'actions' => ['view'], 'roles' => ['?'], ], ], ], ]; }

自定義過濾器:

namespace app\modules\article\components;

use Yii;
use yii\base\ActionFilter;

class ActionTimeFilter extends ActionFilter
{
    private $_startTime;

    public function beforeAction($action)
    {
        $this->_startTime = microtime(true);
        return parent::beforeAction($action);
    }

    public function afterAction($action, $result)
    {
        $time = microtime(true) - $this->_startTime;
        Yii::trace("當前Action執行時間為: '{$action->uniqueId}' spent $time second.");
        return parent::afterAction($action, $result);
    }
}

使用自定義過濾器:

    public function behaviors()
    {
        return [

            //使用自定義過濾器
            'actionTime' =>[
                 'class' => ActionTimeFilter::className(),
                 'only' => ['index','view']
            ],
         ]
    }