Yii2 應用結構 過濾器之核心過濾器
阿新 • • 發佈:2019-01-28
測試程式碼:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['index', 'view'],
//'except' => ['test'], //在該過濾器中不執行該動作
'rules' => [
[
'allow' => true, //yii\filters\AccessRule::allow: 指定該規則是 "允許" 還是 "拒絕" 。(譯者注:true是允許,false是拒絕)
'actions' => ['index'], //yii\filters\AccessRule::actions:指定該規則用於匹配哪些操作。 它的值應該是操作方法的ID陣列。匹配比較是大小寫敏感的。如果該選項為空,或者不使用該選項, 意味著當前規則適用於所有的操作。
//yii\filters\AccessRule::controllers:指定該規則用於匹配哪些控制器。 它的值應為控制器ID陣列。匹配比較是大小寫敏感的。如果該選項為空,或者不使用該選項, 則意味著當前規則適用於所有的操作。(譯者注:這個選項一般是在控制器的自定義父類中使用才有意義)
//yii\filters\AccessRule::roles:指定該規則用於匹配哪些使用者角色。 系統自帶兩個特殊的角色,通過 yii\web\User::isGuest 來判斷:
//?: 用於匹配訪客使用者 (未經認證)
//@: 用於匹配已認證使用者
//使用其他角色名時,將觸發呼叫 yii\web\User::can(),這時要求 RBAC 的支援 (在下一節中闡述)。 如果該選項為空或者不使用該選項,意味著該規則適用於所有角色。
'roles' => ['?'], //roles 選項包含的問號 ? 是一個特殊的標識,代表”訪客使用者”。 //@是另一個特殊標識, 代表”已認證使用者”。
//yii\filters\AccessRule::ips:指定該規則用於匹配哪些 yii\web\Request::userIP 。 IP 地址可在其末尾包含萬用字元 * 以匹配一批字首相同的IP地址。 例如,192.168.* 匹配所有 192.168. 段的IP地址。 如果該選項為空或者不使用該選項,意味著該規則適用於所有角色。
'ips' => ['*'],
//yii\filters\AccessRule::verbs:指定該規則用於匹配哪種請求方法(例如GET,POST)。 這裡的匹配大小寫不敏感。
'verbs' => ['GET','POST'],
//yii\filters\AccessRule::matchCallback:指定一個PHP回撥函式用於 判定該規則是否滿足條件。(譯者注:此處的回撥函式是匿名函式)
'matchCallback' => function ($rule, $action) {
///echo "判斷是否滿足條件.....";
//return true;
return false;
//return date('d-m') === '07-16';
},
//yii\filters\AccessRule::denyCallback: 指定一個PHP回撥函式, 當這個規則不滿足條件時該函式會被呼叫。(譯者注:此處的回撥函式是匿名函式)
'denyCallback' => function ($rule, $action) {
//throw new \Exception('You are not allowed to access this page');
//echo "不滿足條件時執行denyCallback......";
//die();
return "不滿足條件時執行denyCallback。。。。。。";
}
],
[
'allow' => true,
'actions' => ['view'],
'roles' => ['?'],
],
],
],
];
}
自定義過濾器:
namespace app\modules\article\components;
use Yii;
use yii\base\ActionFilter;
class ActionTimeFilter extends ActionFilter
{
private $_startTime;
public function beforeAction($action)
{
$this->_startTime = microtime(true);
return parent::beforeAction($action);
}
public function afterAction($action, $result)
{
$time = microtime(true) - $this->_startTime;
Yii::trace("當前Action執行時間為: '{$action->uniqueId}' spent $time second.");
return parent::afterAction($action, $result);
}
}
使用自定義過濾器:
public function behaviors()
{
return [
//使用自定義過濾器
'actionTime' =>[
'class' => ActionTimeFilter::className(),
'only' => ['index','view']
],
]
}