/ yii2

yii2-filter

Filters 过滤器

Filters 是可以在 controller action 之前和(或)之后运行的对象。例如,在执行 action 之前检查用户是否有对应权限,这就是 access control filter 的工作。又例如可以在 action 运行结束后对内容进行压缩,这就是一个 content compression filter 的工作。

过滤器分两种:

  • pre-filter,在 action 之前运行。
  • post-filter,在 action 之后运行。

使用 Filters

Filters 本质上是一个特殊的 behaviors。所以使用 filters 的方法跟 behaviors 相同:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['index', 'view'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('user')->max('updated_at');
            },
        ],
    ];
}

默认情况下,在 controller 中声明的 filters 会对所有 action 生效。你可以:

  • only,白名单
  • except,黑名单

创建 filters

如果要创建一个 action filter,你需要继承 yii\base\ActionFilter 并 override beforeAction() and/or afterAction() 方法。

beforeAction() 如果返回 false,之后的 filter 都会被跳过,对应的 action 也不会被执行。

下面的例子展示了一个记录 action 执行时间的 filter:

namespace app\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);
    }
}

Core Filters

Yii 提供了一些常用的 filters,你可以在 yii\filters 命名空间下找到。

AccessControl

AccessControl 提供了简单访问控制校验。在一个 action 执行之前,AccessControl 会在列出的规则中找到匹配的第一条规则来判断是 allow 还是 deny 请求的 action。如果没有对应的规则,访问会被 denied。

use yii\filters\AccessControl;

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['create', 'update'],
            'rules' => [
                // deny all POST requests
                [
                    'allow' => false,
                    'verbs' => ['POST']
                ],
                // allow authenticated users
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
                // everything else is denied by default
            ],
        ],
    ];
}

这里的规则可以解读为 only(只) allow(允许) @(认证用户)请求 create,update action。

Authentication Method Filters(认证方法过滤器)

HTTPCache

HttpCache implements client-side caching by utilizing(利用) the Last-Modified and Etag HTTP headers. For example,

use yii\filters\HttpCache;

public function behaviors()
{
    return [
        [
            'class' => HttpCache::className(),
            'only' => ['index'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('user')->max('updated_at');
            },
        ],
    ];
}

VerbFilter

use yii\filters\VerbFilter;

public function behaviors()
{
    return [
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'index'  => ['get'],
                'view'   => ['get'],
                'create' => ['get', 'post'],
                'update' => ['get', 'put', 'post'],
                'delete' => ['post', 'delete'],
            ],
        ],
    ];
}