首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii 1.x Filter 過濾器完整解析:方法型與類別型過濾器、執行順序與實戰範例

     編輯:PHP 相關知識

過濾器基礎概念

Yii 1.x 過濾器可在控制器動作執行前/後介入,支援多重過濾器鏈,可中斷執行。定義於控制器 filters() 方法回傳的陣列中。

兩種定義方式

1. 方法型過濾器

控制器內定義 filter() 方法,接收 $filterChain 參數:

class UserController extends CController {
    public function filters() {
        return array(
            'addFilter + add',  // 套用至 add 動作
        );
    }

    public function filterAddFilter($filterChain) {
        echo "方法型過濾器執行前
"; $filterChain->run(); // 繼續執行後續過濾器與動作 echo "方法型過濾器執行後
"; } public function actionAdd() { echo "actionAdd 執行
"; } }

2. 類別型過濾器

繼承 CFilter,覆寫 preFilter()、postFilter():

class TestFilter extends CFilter {
    protected function preFilter($filterChain) {
        echo "-->TestFilter.preFilter
"; return true; // false 可阻止動作執行 } protected function postFilter($filterChain) { echo "-->TestFilter.postFilter
"; } }

在控制器註冊:

public function filters() {
    return array(
        array('application.filters.TestFilter + create'),  // 套用至 create
    );
}

執行順序驗證

測試場景:SiteController 同時掛載方法型 AccessControl 與類別型 MyFilter

public function filters() {
    return array(
        'AccessControl - create',           // 排除 create
        array('application.filters.MyFilter + create'),
    );
}

結果

  • site/print:filterAccessControl → actionPrint
  • site/create:MyFilter.preFilter → actionCreate → MyFilter.postFilter

若同時套用兩者:

public function filters() {
    return array(
        'AccessControl - create',
        array('application.filters.MyFilter + create,print'),
    );
}
  • site/print:filterAccessControl → MyFilter.pre → actionPrint → MyFilter.post

CFilter 核心原始碼解析

class CFilter extends CComponent implements IFilter {
    public function filter($filterChain) {
        if ($this->preFilter($filterChain)) {
            $filterChain->run();
            $this->postFilter($filterChain);
        }
    }
    protected function preFilter($filterChain) { return true; }
    protected function postFilter($filterChain) { }
}

關鍵點:preFilter 回傳 false 可阻斷動作與後續過濾器。

過濾器規則語法

  • + action1, action2:僅套用列出動作
  • - action1, action2:排除列出動作
  • 無符號:套用所有動作

從 Yii 1.x 遷移到 Yii 2 的對應關係

Yii 1.xYii 2說明
filters() 方法behaviors() 方法過濾器本質為行為
方法型 filterXxx()繼承 ActionFilter 覆寫 beforeAction/afterAction統一物件導向設計
CFilter 基類yii\base\ActionFilter功能對等
accessControlyii\filters\AccessControl功能增強
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved