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