本文只简单记录一下 Yii 1.1 中过滤器的运行流程和原理,如有任何问题,欢迎大家留言讨论。
Yii 1.1 的过滤器是在执行 action 前对某些操作。通过自定义过滤器,开发者可以在为一批 action 添加自己的验证逻辑。可以粗略认为是在执行 action 前执行了一个函数。
Yii 1.1 过滤器的调用是在 controller 类的 run() 函数中,通过调用 runActionWithFilters() 函数,来逐一验证 filters() 函数中定义的 filter。即在 controller 实例生成后,执行 action 前。
具体使用方法:
首先在 controller 中重写 filters() 方法,该方法返回一个过滤器配置数组,每个数据元素代表一个过滤器。对于不同的过滤器类型,数组元素的格式也不同,后边会详细给出例子,所以先不赘述了。
在说过滤器的具体使用之前,首先需要了解一个重要的类 CFilterChain 。此类用一个 list 存储了一个指定 action 的所有 filter 。执行此类的 run() 方法会从 list 中取出一个 filter 进行验证,当 list 中没有元素的时候,表示所有过滤器已顺利通过,则会执行 action 。
所有过滤器类需继承自 CFilter,通过重写 preFilter() 和 postFilter 方法来实现自己的验证逻辑。filter 方法需要传入参数 filterChain ,该参数是一个 CFilterChain 实例,如果该过滤器已验证通过,则需要调用 $filterChain->run() ,之后框架会根据 list 中的过滤器来进行下边的操作。
过滤器类型:
- method-based filter(inline filter):
基于方法(函数)的过滤器称为内联过滤器( inline filter ),此过滤器的执行方式就是执行一个函数,filter 返回的数组元素为一个字符串,后边加中括号来表面此过滤器将应用于(+)(或者不应用于(-))哪些 action,过滤器函数名为 filter + 字符串。例如:
class MyController extends CController
{
public function filters()
{
return array('inlineFilterName[+|- Action1, Action2, ...]');
}
public function filterInlineFilterName($filterChain)
{
// 验证代码
$filterChain->run();
}
}
- class-based filter
基于类的过滤器,filters() 方法返回的数组元素为一个数组,包括类名、需要传入的属性键值对。
class MyController extends CController
{
public function filters()
{
return array(
array(
'filterClassName[+|- Action1, Action2, ...]',
'name1' => 'value1',
'name2' => 'value2',
...
)
);
}
}