YII2框架集成go!aop

摘要:
classAopAspectKernelextendsAspectKernel{protectedfunctionconfigureAop(AspectContainer$container){$container->$app->init(Yii;$app->['debug'=>'appDir'=<is_object($obj);$invoke-&gt:

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

免责声明:文章转载自《YII2框架集成go!aop》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇练习2-10 计算分段函数[1] (10 分)synchronized实现原理及其优化-(自旋锁,偏向锁,轻量锁,重量锁)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP(Mysql/Redis)消息队列的介绍及应用场景案例

在进行网站设计的时候,有时候会遇到给用户大量发送短信,或者订单系统有大量的日志需要记录,还有做秒杀设计的时候,服务器无法承受这种瞬间的压力,无法正常处理,咱们怎么才能保证系统正常有效的运行呢?这时候我们就要引用消息队列来实现这类的需求,这时候就需要一个中间的系统进行分流和解压。消息队列就是一个中间件,需要配合其他合理使用。  消息队列的概念、原理和场景 本...

jquery的tree table(树表)

  因项目需要,需要在表格中加入tree,使用了jquery的tree table,经美化,完美兼容各种框架的table;   请移步下载tree table 的js文件及css文件等,http://ludo.cubicphuse.nl/jquery-treetable/;      用到css文件:<link rel="stylesheet" hr...

admin 的使用及参数配置

admin的使用 创建超级用户 在admin.py注册模型表 admin.site.register(models.author) django默认注册两张自带的表 admin 生成自定义模型url的规律 http://127.0.0...

html中删除表格的一行(有弹窗)

html中删除表格一行其实很简单,但是加上一个提示弹窗后,点击确定后却获取不到要删除的是哪一行,下面是一个demo html: <tr> <td> <input type="checkbox" /> </td> <td>安...

无套路,3分钟带你轻松上手SonarQube

前言 想成为一名优秀的工程师,代码质量一定要过关! 开始搭建 SonarQube 1、获取 postgresql 的镜像 $ docker pull postgres 2、启动 postgresql $ docker run --name db -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -d...

四、Haproxy的4层及7层IP透传

IP透传是web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。 四层IP透传配置   haproxy 配置: listen web_prot bind 192.168.32.204:80 mode tcp balance roundrobin server web1 10.0.0.201 send-proxy...