欢迎加入QQ讨论群258996829
麦子学院 头像
苹果6袋
6
麦子学院

Yii2框架学习之过滤器behaviors()行为调用详解

发布时间:2016-12-21 15:44  回复:0  查看:3325   最后回复:2016-12-21 15:44  
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后显示

来源:尘埃
您还未登录,请先登录

热门帖子

最新帖子