您的位置:首页 > 编程语言 > PHP开发

Yii 1.1 过滤器原理学习

2016-02-24 14:52 399 查看
本文只简单记录一下 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',
...
)
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: