• YII2框架集成go!aop


    AOP实践:
    YII2框架本身拥有一个功能,叫做行为.它可以动态的为当前的类附加额外的功能,但这种功能在代码层级结构是静态的,有侵入性的。

    下面以YII2框架集成go!aop库为例,介绍在YII2中如何实现AOP编程.(go!aop简介,可以参考go!aop的官网.)

    由于YII框架拥有自己的类加载器,所在集成go!aop的时候,不能正常的工作,所以要将其禁用掉,使用composer提供的类加载器。
    如下代码所示(这里使用YII2高级应用模板):

    1、找到  spl_autoload_register(['Yii', 'autoload'], true, true);  (PROJECT_PATH/vendor/yiisoft/yii2/Yii.php) 将其禁用掉.

    2、执行  composer require goaop/framework

    3、修改composer.json文件,加入如下代码段:

    "autoload": {
           "psr-4": {
             "backend\": "backend//",
             "frontend\": "frontend//",
             "common\": "common//"
           }
     }
    

    4、 在frontend 目录下创建一个components是目录,并新建一个类AopAspectKernel,例如:

    namespace frontendcomponents;
    use frontendaspectsMonitorAspect;
    use GoCoreAspectContainer;
    use GoCoreAspectKernel;
    class AopAspectKernel extends AspectKernel
    {
            protected function configureAop(AspectContainer $container)
            {
                $container->registerAspect(new MonitorAspect());
            }
    }

    5、在forntend目录下在新建一个类InitAopComponent,并使其实现BootstrapInterface,使其可以在YII2框架引导时被自动引导 

    namespace frontendcomponents;
    use yiiaseBootstrapInterface;
    class InitAopComponent implements BootstrapInterface
    {
            public function bootstrap($app)
            {
                print_r(Yii::$app->params['aop']);
                $applicationAspectKernel = AopAspectKernel::getInstance();
                $applicationAspectKernel->init(Yii::$app->params['aop']);
            }
    }

    6、在frontend/config/params.php中新增如下代码:

    'aop' => [
           'debug' => true,
           'appDir' => dirname(__DIR__),
           'cacheDir' => dirname(__DIR__) . '/runtime/aop',
           'includePaths' => [
               dirname(__DIR__)
           ]
       ]

    7、在frontend下面新建aspects目录,并新建类MonitorAspect,代码如下:

    namespace frontendaspects;
     
    use GoAopAspect;
    use GoAopInterceptMethodInvocation;
    use GoLangAnnotationBefore;
    class MonitorAspect implements Aspect
    {
            /**
             * Method that will be called before real method
             *
             * @param MethodInvocation $invocation Invocation
             * @Before("execution(public frontendcomponentsAopTestComponent->*(*))")
             */
            public function beforeMethodExecution(MethodInvocation $invocation)
            {
                $obj = $invocation->getThis();
                echo 'Calling Before Interceptor for method: ',
                is_object($obj) ? get_class($obj) : $obj,
                $invocation->getMethod()->isStatic() ? '::' : '->',
                $invocation->getMethod()->getName(),
                '()',
                ' with arguments: ',
                json_encode($invocation->getArguments()),
                "<br>
    ";
            }
    }

    8、修改frontend/config/main.php文件,并在components数组下新增一个key,代码如下:

    'components'=>[
           'aop' => [
               'class' => 'frontendcomponentsInitAopComponent'
           ]
       ]  

    9、修改frontend/config/main.php文件,并在bootstrap数组下新增aop值,代码如下:

     'bootstrap'=>['log','aop'] 

    原文链接:https://www.cnblogs.com/cmacro/p/9327602.html

    参考链接:https://blog.csdn.net/guiyecheng/article/details/56016791

  • 相关阅读:
    Python中的字典
    Python中的元组
    Python中常见的公共方法
    Python中的列表
    Python的循环语句
    Python的流程控制
    Kubernetes-kubectl命令出现错误【The connection to the server localhost:8080 was refused
    nyoj 77-开灯问题 (倍数遍历)
    nyoj 76-超级台阶 (递推)
    nyoj 75-日期计算 (闰年与平年的判断)
  • 原文地址:https://www.cnblogs.com/ghjbk/p/11171656.html
Copyright © 2020-2023  润新知