天天看點

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的過濾規則大家了解了吧?試着寫寫吧