您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > PHP框架 > Yii Framework

Yii Framework: filter 全解

作者:  来源:互联网  日期:2013-11-06 23:06:39
收藏  评论:( 0 )  阅读:563

Yii Framework中filters()方法定义在CController里,用Gii生成Controller时里面就有filters方法,代码如下:

public function filters() 
{ 
    // return the filter configuration for this controller, e.g.: 
    return array( 
        'inlineFilterName', 
        array( 
            'class'=>'path.to.FilterClass', 
            'propertyName'=>'propertyValue', 
        ), 
    ); 
}

这个方法没有做什么实质性的动作,它只是把你将要执行的过滤方法方法名或者过滤类的类名返回给CController。 我们先看使用方法的方式,也即上面代码里的’inlineFilterName’含义,这个inlineFilterName意思是在当前控制器的类中有 一个inlineFilterName()方法,该方法里就是你要执行的过滤规则,比如:当前在TestController里:

<?php 
class TestController extends CController{ 
    //该方法判断用户是否登录  
    public function filterInlineFilterName($filterChain){ 
        if (Yii::app()->user->isGuest) 
            Yii::app()->user->loginRequired();//封装了登录的url 
        $filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。 
    } 
    public function filters(){ 
    return array('inlineFilterName'); 
    } 
} 
?>

Ok,上面的代码就是对当前控制器的所有action都执行了检查用户是否登录了操作,如果用户未登录则跳转到登录页,如果登录则继续执行action里的内容。这是利用在当前控制器下写方法的方式执行过滤,同样,写成类也是可以的,引入方式

public function filters() 
{ 
    // return the filter configuration for this controller, e.g.: 
    return array( 
        array( 
            'class'=>'path.to.FilterClass',//类名 
            'propertyName'=>'propertyValue',//属性名,属性值 
        ), 
    ); 
}

那可能有的哥们要问了,那要是我想让特定的方法检查是否登录了怎么做呢?下面就是我要说的了,同样,还是在TestController里:

<?php 
class TestController extends CController{ 
    //该方法判断用户是否登录  
    public function filterInlineFilterName($filterChain){//必须以filter开头,后跟名字 
        if (Yii::app()->user->isGuest && !in_array($filterChain->action->id,$this->inlineFilterNameAction())) 
            Yii::app()->user->loginRequired();//封装了登录的url 
        $filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。 
    } 
    public function filters(){ 
         return array('inlineFilterName'), 
      } 
    public function inlineFilterNameAction(){//返回要执行过滤的action 
        return array('action1','action2','action3'); 
    } 
} 
?>

这样就可以做到对指定的action添加自定义的过滤规则了。

其实,Yii Framework里已经封装好了一个过滤类,这里带大家看看它是怎样实现的,其实原理和上面一模一样。我们先来看看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()方法的写法:

public function accessRules() 
{ 
    return array( 
        'allow', // or 'deny' 
        //可选规则,本规则适用于列出的所有动作ID(不区分大小写) 
        //如果未指定此项,则规则适用于所有动作。 
        'actions' => array('edit', 'delete'), 
        //可选规则,本规则适用于列出的所有控制器ID(不区分大小写) 
        'controllers' => array('post', 'admin/user'), 
        //可选规则,本规则适用于列出的所有用户ID(不区分大小写) 
        //使用*号表示所有用户,?号表示来宾用户,@表示通过身份验证的用户。 
        'users' => array('thomas', 'kevin'), 
        //可选规则,本规则适用于列出的所有角色(区分大小写)。 
        'roles' => array('admin', 'editor'), 
        //可选规则,本规则适用于列出的所有IP地址。 
        //如127.0.0.1, 127.0.0.* 
        'ips' => array('127.0.0.1'), 
        //可选规则,本规则适用于列出的所有请求类型(区分大小写)。 
        'verbs' => array('GET', 'POST'), 
        //可选规则,一个PHP表达式,其值表示此规则是否适用 
        'expression' => '!$user->isGuest && $user->level==2', 
        //可选规则,显示自定义的错误消息 
        //自1.1.1版后,此选项开始使用。 
        'message' => 'Access Denied.', 
    ); 
}




除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/yii/585.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论