zoukankan      html  css  js  c++  java
  • 开发Yii2过滤器并通过behaviors()行为调用(转)

    在Yii2的几乎每个controller中,我们都会看到一个函数behaviors(),通常,我们用这个函数来配置控制器的权限,例如:
    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

    模仿这些过滤器,我们也可以开发自己的过滤器。

    还是把测试的过滤器放到frontend/libs里,新建文件frontend/libs/TestFilter.php
    <?php
    namespace frontendlibs;
    use Yii;
    use yiiaseAction;
    use yiiaseActionFilter;
    class TestFilter extends ActionFilter
    {
        //在action之前运行,可用来过滤输入
        public function beforeAction($action) {
            echo '在调用action前显示<br/>';
            return TRUE;//如果返回值为false,则action不会运行
        }
        //在action之后运行,可用来过滤输出
        public function afterAction($action, $result) {
            return $result.'在调用action后显示<br/>';//可以对action输出的$result进行过滤,retun的内容会直接显示
        }
    }
    然后新建 文件frontend/controller/TestController.php
    <?php
    namespace frontendcontrollers;
    use yiiwebcontroller;
    class TestController extends Controller {
        public function behaviors() {
            return [
                'test' => [
                    'class' => 'frontendlibsTestFilter'//调用过滤器
                ]
            ];
        }
        public function actionFilter() {
            return '当前action显示<br/>';//返回的内容会递交给过滤器,由afterAction进行处理
        }
    }
    最后,测试显示结果为:
    在调用action前显示
    当前action显示
    在调用action后显示
    过滤器完成。

  • 相关阅读:
    1052: 最大报销额
    1036: 小希的数表
    1050: 找出直系亲属
    1048: 导弹防御系统
    1051: 魔咒词典
    以大数据眼光欣赏唐人文墨(一)
    Java 内部类详解
    那些“不务正业”的IT培训公司
    Brackets 前端编辑器试用
    Emmet 快速编写html代码
  • 原文地址:https://www.cnblogs.com/sandea/p/6509692.html
Copyright © 2011-2022 走看看