• 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

  • 相关阅读:
    surfer插值方法及提取插值结果 转载
    Surfer的grd数据转换成gmt可用的grd数据方法
    Appium+Python3+ Android入门
    Flask入门的第一个项目
    测试报告模板
    火狐浏览器之伪造IP地址
    获取apk的签名信息
    初识kibana
    Fiddler模拟post四种请求数据
    Python-正则表达式
  • 原文地址:https://www.cnblogs.com/ghjbk/p/11171656.html
Copyright © 2020-2023  润新知