filters()方法定义在CController里,用Gii生成Controller时里面就有filters方法,代码如下:
01 |
public function filters() |
02 |
{ |
03 |
// return the filter configuration for this controller, e.g.: |
04 |
return array( |
05 |
'inlineFilterName', |
06 |
array( |
07 |
'class'=>'path.to.FilterClass', |
08 |
'propertyName'=>'propertyValue', |
09 |
), |
10 |
); |
11 |
} |
这个方法没有做什么实质性的动作,它只是把你将要执行的过滤方法方法名或者过滤类的类名返回给CController。 我们先看使用方法的方式,也即上面代码里的’inlineFilterName’含义,这个inlineFilterName意思是在当前控制器的类中有 一个inlineFilterName()方法,该方法里就是你要执行的过滤规则,比如:当前在TestController里:
01 |
<?php |
02 |
class TestController extends CController{ |
03 |
//该方法判断用户是否登录 |
04 |
public function filterInlineFilterName($filterChain){ |
05 |
if (Yii::app()->user->isGuest) |
06 |
Yii::app()->user->loginRequired();//封装了登录的url |
07 |
$filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。 |
08 |
} |
09 |
filters(){ |
10 |
return array('inlineFilterName'), |
11 |
} |
12 |
} |
13 |
14 |
?> |
01 |
public function filters() |
02 |
{ |
03 |
// return the filter configuration for this controller, e.g.: |
04 |
return array( |
05 |
array( |
06 |
'class'=>'path.to.FilterClass',//类名 |
07 |
'propertyName'=>'propertyValue',//属性名,属性值 |
08 |
), |
09 |
); |
10 |
} |
01 |
<?php |
02 |
class TestController extends CController{ |
03 |
//该方法判断用户是否登录 |
04 |
public function filterInlineFilterName($filterChain){//必须以filter开头,后跟名字 |
05 |
if (Yii::app()->user->isGuest && !in_array($filterChain->action->id,$this->inlineFilterNameAction())) |
06 |
Yii::app()->user->loginRequired();//封装了登录的url |
07 |
$filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。 |
08 |
} |
09 |
public function filters(){ |
10 |
return array('inlineFilterName'), |
11 |
} |
12 |
public function inlineFilterNameAction(){//返回要执行过滤的action |
13 |
return array('action1','action2','action3'); |
14 |
} |
15 |
} |
16 |
17 |
?> |
其实,Yii里已经封装好了一个过滤类,这里带大家看看它是怎样实现的,其实原理和上面一模一样。我们先来看看CController里的public void filterAccessControl(CFilterChain $filterChain) 方法:
public function filterAccessControl($filterChain)
{
$filter=new CAccessControlFilter;
$filter->setRules($this->accessRules());
$filter->filter($filterChain);
}
可以看到,它是以filter开头的函数,大家知道它是干嘛的了吧?该方法实例化了一个CAccessControlFilter类,该类就是处理过滤规则的,然后把$this->accessRules()作为一个参数付给 $filter->setRules()方法。
下面来看看accessRules()方法的写法:
01 |
public function accessRules(){ |
02 |
return array( |
03 |
'allow', // or 'deny' |
04 |
//可选规则,本规则适用于列出的所有动作ID(不区分大小写) |
05 |
//如果未指定此项,则规则适用于所有动作。 |
06 |
'actions'=>array('edit', 'delete'), |
07 |
//可选规则,本规则适用于列出的所有控制器ID(不区分大小写) |
08 |
'controllers'=>array('post', 'admin/user'), |
09 |
//可选规则,本规则适用于列出的所有用户ID(不区分大小写) |
10 |
//使用*号表示所有用户,?号表示来宾用户,@表示通过身份验证的用户。 |
11 |
'users'=>array('thomas', 'kevin'), |
12 |
//可选规则,本规则适用于列出的所有角色(区分大小写)。 |
13 |
'roles'=>array('admin', 'editor'), |
14 |
//可选规则,本规则适用于列出的所有IP地址。 |
15 |
//如127.0.0.1, 127.0.0.* |
16 |
'ips'=>array('127.0.0.1'), |
17 |
//可选规则,本规则适用于列出的所有请求类型(区分大小写)。 |
18 |
'verbs'=>array('GET', 'POST'), |
19 |
//可选规则,一个PHP表达式,其值表示此规则是否适用 |
20 |
'expression'=>'!$user->isGuest && $user->level==2', |
21 |
//可选规则,显示自定义的错误消息 |
22 |
//自1.1.1版后,此选项开始使用。 |
23 |
'message'=>'Access Denied.', |
24 |
) |
25 |
26 |
} |