
麦子学院 2016-12-21 15:44
Yii2框架学习之过滤器behaviors()行为调用详解
回复:0 查看:3326
在
Yii2框架开发
中,使用行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充。 通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像类本来就有这些属性和方法一样。 而且不需要写一个新的类去继承或包含现有类。
Yii中的行为,其实是 yii\base\Behavior 类的实例, 只要将一个Behavior实例绑定到任意的 yii\base\Component 实例上, 这个Component就可以拥有该Behavior所定义的属性和方法了。而如果将行为与事件关联起来,可以玩的花样就更多了。
在Yii2的几乎每个controller中,我们都会看到一个函数behaviors(),通常,我们用这个函数来配置控制器的权限,例如:
/**
* 行为过滤器(beforeAction,afterAction)
* @author wangying
* @override 方法重写
* @return array
*/public function behaviors(){
return [
'access' => [
'class' => AccessControl::className(),//过滤器
'rules' => [
[
'actions' => ['login', 'error','index'],
'allow' => true,
],
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),//过滤器
'actions' => [
'logout' => ['post'],
],
],
];
}
注意代码中加亮的两行,这里调用的类,我们都称之为过滤器。在controller中调用过滤器,可以控制当前controller中的所有action,我们也可以在模块(module)或是应用主体中调用,来控制整个模块或是整个应用。
Yii2提供了如下过滤器:
AccessControl
ContentNegotiator
Cors
HttpCache
PageCache
RateLimiter
AuthMethod
模仿这些过滤器,我们也可以开发自己的过滤器。
还是把测试的过滤器放到app/base/filters里,新建文件TestFilter.php
namespace app\base\filters;use Yii;use yii\base\Action;use yii\base\ActionFilter;class TestFilter extends ActionFilter{
//在action之前运行,可用来过滤输入
public function beforeAction($action)
{
echo '在调用action前显示';
return TRUE;//如果返回值为false,则action不会运行
}
//在action之后运行,可用来过滤输出
public function afterAction($action, $result)
{
return $result.'在调用action后显示';//可以对action输出的$result进行过滤,retun的内容会直接显示
}
}
然后新建 文件app/controller/TestController.php
namespace frontend\controllers;
use yii\web\controller;class TestController extends Controller {
public function behaviors() {
return [
'test' => [
'class' => app\base\filters\TestFilter'//调用过滤器
]
];
}
public function actionFilter() {
return '当前action显示';//返回的内容会递交给过滤器,由afterAction进行处理
}
}
最后,测试显示结果为:
在调用action前显示
当前action显示
在调用action后显示
来源:尘埃
Yii中的行为,其实是 yii\base\Behavior 类的实例, 只要将一个Behavior实例绑定到任意的 yii\base\Component 实例上, 这个Component就可以拥有该Behavior所定义的属性和方法了。而如果将行为与事件关联起来,可以玩的花样就更多了。
在Yii2的几乎每个controller中,我们都会看到一个函数behaviors(),通常,我们用这个函数来配置控制器的权限,例如:
/**
* 行为过滤器(beforeAction,afterAction)
* @author wangying
* @override 方法重写
* @return array
*/public function behaviors(){
return [
'access' => [
'class' => AccessControl::className(),//过滤器
'rules' => [
[
'actions' => ['login', 'error','index'],
'allow' => true,
],
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),//过滤器
'actions' => [
'logout' => ['post'],
],
],
];
}
注意代码中加亮的两行,这里调用的类,我们都称之为过滤器。在controller中调用过滤器,可以控制当前controller中的所有action,我们也可以在模块(module)或是应用主体中调用,来控制整个模块或是整个应用。
Yii2提供了如下过滤器:
AccessControl
ContentNegotiator
Cors
HttpCache
PageCache
RateLimiter
AuthMethod
模仿这些过滤器,我们也可以开发自己的过滤器。
还是把测试的过滤器放到app/base/filters里,新建文件TestFilter.php
namespace app\base\filters;use Yii;use yii\base\Action;use yii\base\ActionFilter;class TestFilter extends ActionFilter{
//在action之前运行,可用来过滤输入
public function beforeAction($action)
{
echo '在调用action前显示';
return TRUE;//如果返回值为false,则action不会运行
}
//在action之后运行,可用来过滤输出
public function afterAction($action, $result)
{
return $result.'在调用action后显示';//可以对action输出的$result进行过滤,retun的内容会直接显示
}
}
然后新建 文件app/controller/TestController.php
namespace frontend\controllers;
use yii\web\controller;class TestController extends Controller {
public function behaviors() {
return [
'test' => [
'class' => app\base\filters\TestFilter'//调用过滤器
]
];
}
public function actionFilter() {
return '当前action显示';//返回的内容会递交给过滤器,由afterAction进行处理
}
}
最后,测试显示结果为:
在调用action前显示
当前action显示
在调用action后显示
来源:尘埃