使用行为(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后显示