Yii笔记之filter用法
Filter 是一个代码片段,被配置用来在一个控制器的动作执行之前/后执行. 例如, an access control filter 可被执行以确保在执行请求的 action 之前已经过验证; 一个 performance filter 可被用来衡量此 action 执行花费的时间.
一个 action 可有多个 filter. filter 以出现在 filter 列表中的顺序来执行.一个 filter 可以阻止当前 action 及剩余未执行的 filter 的执行.
一个 filter 可被定义为一个 controller 类的方法. 此方法的名字必须以 filter 开始. 例如,方法 filterAccessControl 的存在定义了一个名为 accessControl 的 filter. 此filter 方法必须如下:public function filterAccessControl($filterChain)
{
// call $filterChain->run() to continue filtering and action execution
}复制代码$filterChain 是 CFilterChain 的一个实例, CFilterChain 代表了与被请求的 action 相关的 filter 列表. 在此 filter 方法内部, 我们可以调用 $filterChain->run() 以继续 执行其他过滤器以及 action 的执行.
一个 filter 也可以是 CFilter 或其子类的一个实例. 下面的代码定义了一个新的 filter 类:class PerformanceFilter extends CFilter
{
protected function preFilter($filterChain)
{
// logic being applied before the action is executed
return true; // false if the action should not be executed
}
protected function postFilter($filterChain)
{
// logic being applied after the action is executed
}
}复制代码要应用 filter 到 action, 我们需要重写CController::filters() 方法. 此方法应当返回一个 filter 配置数组. 例如,class PostController extends CController
{
......
public function filters()
{
return array(
'postOnly + edit, create',
array(
'application.filters.PerformanceFilter - edit, create',
'unit'=>'second',
),
);
}
}复制代码上面的代码指定了两个 filter: postOnly 和 PerformanceFilter. postOnly filter 是基于方法的 (对应的 filter 方法已被定义在 CController 中); 而 PerformanceFilter filter 是基于对象的(object-based). 路径别名 application.filters.PerformanceFilter 指定 filter 类文件是protected/filters/PerformanceFilter. 我们使用一个数组来配置PerformanceFilter 以便它可被用来初始化此 filter 对象的属性值. 在这里 PerformanceFilter 的 unit 属性被将初始化为 'second'.
使用+和-操作符, 我么可以指定哪个 action 此 filter 应当和不应当被应用. 在上面的例子中, postOnly 被应用到 edit 和 create action, 而 PerformanceFilter 被应用到所有的 actions 除了 edit和 create. 若+或-均未出现在 filter 配置中, 此 filter 将被用到所有 action .