Yii2过滤器-behaviors()行为调用

使用行为(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后显示
相关文章
  1. $_GET,$_POST与urldecode的使用风险
  2. yii2框架的错误处理
  3. 密码保护:PHP多进程编程
  4. 全排列算法原理和实现
  5. PHP静态方法和非静态方法的使用场景
  6. uuid生成方案
本站版权
1、本站所有主题由该文章作者发表,该文章作者与尘埃享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和尘埃的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:
二维码
Posted in php, Yii2, 编程语言
Comments are closed.