天天看点

YII 过滤器 filters

yii中的过滤器是指,通过配置,在一个控制器的动作被执行之前或者之后执行的一小段代码 。一个例子是,如果我们想要在某个动作执行后额外记录些什么,或者执行一些审核逻辑,可以编写一个简单的审计过滤器来进行这个动作之后的处理任务。

beforevalidate 和aftervalidate

beforesave 和 aftersave : 这两个将在保存 ar 实例之前和之后被调用。

beforedelete 和 afterdelete : 这两个将在一个 ar 实例被删除之前和之后被调用。

afterconstruct : 这个将在每个使用 <code>new</code> 操作符创建 ar 实例后被调用 。

beforefind : 这个将在一个 ar 查找器被用于执行查询(例如 <code>find()</code> , <code>findall()</code> )之前被调用。

afterfind : 这个将在每个 ar 实例作为一个查询结果创建时被调用。

尽量不要用过滤器,过滤器是全局的,可能对其他业务操作造成影响

cwebuser

afterlogin() 用户成功登录后被调用的方法。 cwebuser 

afterlogout() 用户登出后被调用的方法。 cwebuser 

beforelogin() 在用户登录那一时刻前被调用的方法。 cwebuser 

beforelogout() 当用户调用logout注销时,将调用该方法。

model中

YII 过滤器 filters

protected function  beforesave() {  

    if($this-&gt;isnewrecord){  

        $this-&gt;reg_date = $this-&gt;modify_date = time();  

        $this-&gt;passwd = $this-&gt;haspassword($this-&gt;passwd1);  

        $this-&gt;credit = 0;  

    }else  

    $this-&gt;modify_date = time();  

    if($this-&gt;getscenario() == 'changepassword' || $this-&gt;getscenario() == 'resetpassword'){  

    }  

    return parent::beforesave();  

}  

YII 过滤器 filters

protected function  beforefind() {  

    parent::beforefind();  

    $this-&gt;getdbcriteria()-&gt;addcolumncondition(array('type'=&gt;self::type_wiki));  

    return true;  

YII 过滤器 filters

protected function aftersave(){  

    parent::aftersave();  

    if(!$this-&gt;isnewrecord){  

        $this-&gt;dbconnection-&gt;createcommand('delete from posttag where postid='.$this-&gt;id)-&gt;execute();  

一个普遍的例子就是,当我们要求执行某个特定的控制器动作之前,用户必须已经登录,那么可以写一个简单的访问过滤器在这个动作执行之前来检查这个要求。

beforeaction

afteraction

controller中

YII 过滤器 filters

public function beforeaction($action){  

    if(yii::app()-&gt;user-&gt;isguest&amp;&amp;$action-&gt;getid()!='login'){  

        $this-&gt;redirect(yii::app()-&gt;loginurl);  

    return parent::beforeaction($action);  

filter过滤器主要是控制访问

yii自定义登录过滤器

YII 过滤器 filters

&lt;?php  

class sessioncheckfilter extends cfilter  

{  

    protected function prefilter($filterchain)  

    {  

        if (yii::app()-&gt;user-&gt;id &gt; 0) {  

            $filterchain-&gt;run();  

        } else {  

            yii::app()-&gt;getcontroller()-&gt;redirect(array('user/login'));  

        }  

        return true;  

 然后在你的controller中通过filters方法使用,所有xxcontroller继承controller即可

YII 过滤器 filters

class controller extends ccontroller  

    public function filters()  

        return array(  

            array('application.filters.sessioncheckfilter - login, register')  

        );  

YII 过滤器 filters

class testcontroller extends ccontroller  

    //该方法判断用户是否登录   

    public function filterinlinefiltername($filterchain)  

        if (yii::app()-&gt;user-&gt;isguest &amp;&amp; !in_array($filterchain-&gt;action-&gt;id, $this-&gt;inlinefilternameaction())) {  

            yii::app()-&gt;user-&gt;loginrequired(); //封装了登录的url  

        $filterchain-&gt;run(); //参数$filterchain就是执行该filter的action实例,调用$filterchain-&gt;run()其实就是执行该action了。  

        return array('inlinefiltername');  

    public function inlinefilternameaction()  

    { //返回要执行过滤的action  

        return array('action1', 'action2', 'action3');  

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

其实,yii里已经封装好了一个过滤类,这里带大家看看它是怎样实现的,其实原理和上面一模一样。我们先来看看ccontroller里的public void filteraccesscontrol(cfilterchain $filterchain) 方法:

YII 过滤器 filters

public function filteraccesscontrol($filterchain)  

    $filter=new caccesscontrolfilter;  

    $filter-&gt;setrules($this-&gt;accessrules());  

    $filter-&gt;filter($filterchain);  

可以看到,它是以filter开头的函数,大家知道它是干嘛的了吧?该方法实例化了一个caccesscontrolfilter 类,该类就是处理过滤规则的,然后把$this-&gt;accessrules()作为一个参数付给 $filter-&gt;setrules()方法。 下面来看看accessrules()方法的写法:

YII 过滤器 filters

public function accessrules()  

    return array(  

        'allow', // or 'deny'  

        //可选规则,本规则适用于列出的所有动作id(不区分大小写)  

        //如果未指定此项,则规则适用于所有动作。  

        'actions' =&gt; array('edit', 'delete'),  

        //可选规则,本规则适用于列出的所有控制器id(不区分大小写)  

        'controllers' =&gt; array('post', 'admin/user'),  

        //可选规则,本规则适用于列出的所有用户id(不区分大小写)  

        //使用*号表示所有用户,?号表示来宾用户,@表示通过身份验证的用户。  

        'users' =&gt; array('thomas', 'kevin'),  

        //可选规则,本规则适用于列出的所有角色(区分大小写)。  

        'roles' =&gt; array('admin', 'editor'),  

        //可选规则,本规则适用于列出的所有ip地址。  

        //如127.0.0.1, 127.0.0.*  

        'ips' =&gt; array('127.0.0.1'),  

        //可选规则,本规则适用于列出的所有请求类型(区分大小写)。  

        'verbs' =&gt; array('get', 'post'),  

        //可选规则,一个php表达式,其值表示此规则是否适用  

        'expression' =&gt; '!$user-&gt;isguest &amp;&amp; $user-&gt;level==2',  

        //可选规则,显示自定义的错误消息  

        //自1.1.1版后,此选项开始使用。  

        'message' =&gt; 'access denied.',  

    );  

好了,这下对yii的过滤规则大家了解了吧?试着写写吧