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 .