2013年11月17日 星期日

yii framework - filter實作的方式 (附帶觀念釐清)

相信很多朋友在學習yii 的過程中對於裡面的一些function實際上要如何運用有很大的疑問, 其實我也是, 剛在爬文的時候意外在對岸 HilaiHiqu的部落格 找到這篇好文, 翻譯後轉載內容如下:


今天幫群裡的朋友看filter,才發現原來Yii裡有這麼強大的東西。廢話不多說,在咱們的controller裡加入自己的filter吧。

public function filters()
{
return array(
'accessControl',// perform access control for CRUD operations
'testFilter + list, show',
);
}

public function FilterTestFilter($filterChain){
echo"begin";
$filterChain->run();
echo"end";
}



怎麼樣,很簡單吧,現在執行下你的action看看有什麼結果。
filter的作用就是在action執行前執行後執行某些操作。自定義的filter方法​​必須以Filter開頭,名字就是filters方法裡的名字。參數$filterChain就是執行該filter的action實例,調用$filterChain->run()其實就是執行該action了。


補充說明:
看官網的圖就可以更清楚之間的關係了
































在有設置filter的時候, 要執行action之前會先自動載入filter.[請參考註1]

例如:如果你要的controller裡面所有的action在執行前後進行權限的檢查, 如果是未登入就不執行該action並顯示錯誤訊息, 感覺很熟悉嗎? 沒錯! 這就是我們用gii 建立的CRUD時, 那些controller裡面預設的filter, 再看一次yii 幫我們寫的cord:

/**
* @return array action filters
*/
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
'postOnly + delete', // we only allow deletion via POST request
);
}

/**
* Specifies the access control rules.
* This method is used by the 'accessControl' filter.
* @return array access control rules
*/
public function accessRules()
{
return array(
array('allow',  // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update'),
'users'=>array('@'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
'users'=>array('admin'),
),
array('deny',  // deny all users
'users'=>array('*'),
),
);
}

小地方釐清:filter的命名照理講是要filter開頭, 但是預設filter裡的accessControl指的是 accessRules()這個function喔!

註1:
使用加減號,我們可指定哪些動作應該或不應該應用過濾器。上述代碼中,postOnly 應只被應用於delete動作。如果過濾器配置中沒有使用加減號,則此過濾器將被應用於所有動作。

沒有留言:

張貼留言