swoft 切面AOP尝试
Posted brady-wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swoft 切面AOP尝试相关的知识,希望对你有一定的参考价值。
官网文档 https://www.swoft.org/documents/v2/basic-components/aop/
视频教程 https://www.bilibili.com/video/BV12J411j721?p=51
切面 我理解 就是不破坏原有代码逻辑,往里面加入需要执行的前置 后置 操作
- PointBean:定义目标类切点
include
:需被 指定 为切点的目标类集合exclude
:需被 排除 为切点的目标类集合
- PointAnnotation:定义 注解类 切点,所有使用对应注解的方法均会通过该切面类代理
inlucde
:需被 织入 的注解类集合exclude
:需被 排除 的注解类集合
- PointExecution:定义确切的目标类方法。
include
:需被 织入 的目标类方法集合,支持正则表达式exclude
:需被 排除 的目标类方法集合,支持正则表达式
定义切面类 appAspectTestAspect.php
指定方法切入的
<?php namespace AppAspect; use SwoftAopAnnotationMappingAfter; use SwoftAopAnnotationMappingAspect; use SwoftAopAnnotationMappingBefore; use SwoftAopAnnotationMappingPointExecution; /** * @Aspect() * @PointExecution(include={"AppHttpControllerHomeController::hi.*"}) */ class TestAspect { /** * @Before() */ public function before() { echo "我是前置".PHP_EOL; } /** * @After() */ public function after() { echo "我是后置".PHP_EOL; } }
浏览器访问 /hi
控制台输出
____ _____ ___ ___ / __/ _____ / _/ /_ |_ | / _ _ | |/|/ / _ / _/ __/ / __/_/ // / /___/|__,__/\___/_/ \__/ /____(_)___/ SERVER INFORMATION(v2.0.9) ******************************************************************************** * HTTP | Listen: 0.0.0.0:18306, Mode: Process, Worker: 6, Task worker: 12 ******************************************************************************** HTTP Server Start Success! 2020/07/18-19:18:38 [INFO] SwoftServerServer:startSwoole(491) SwooleRuntime::enableCoroutine 2020/07/18-19:18:38 [INFO] SwoftListenerBeforeStartListener:handle(27) Server extra info: pidFile @runtime/swoft.pid 2020/07/18-19:18:38 [INFO] SwoftListenerBeforeStartListener:handle(28) Registered swoole events: start, shutdown, managerStart, managerStop, workerStart, workerStop, workerError, request, task, finish Server start success (Master PID: 16060, Manager PID: 16065) 我是前置 我是后置
访问hello 控制台不会触发 不会打印
如果改为
/**
* @Aspect()
* @PointExecution(include={"AppHttpControllerHomeController::h.*"})
*/
就会触发了
通过使用连接点 joinpoint可以拿到执行方法的参数 返回值等 可以放到前置 做鉴权 后置 做日志
<?php namespace AppAspect; use SwoftAopAnnotationMappingAfter; use SwoftAopAnnotationMappingAfterReturning; use SwoftAopAnnotationMappingAspect; use SwoftAopAnnotationMappingBefore; use SwoftAopAnnotationMappingPointExecution; use SwoftAopPointJoinPoint; use SwoftHttpMessageRequest; /** * @Aspect() * @PointExecution(include={"AppHttpControllerHomeController::h.*"}) */ class TestAspect { /** * @Before() * @param JoinPoint $joinPoint */ public function before(JoinPoint $joinPoint) { echo "我是前置".PHP_EOL; /** @var Request $request */ $request = $joinPoint->getArgs()[0]; $params = $request->getQueryParams(); //可以用来做鉴权 var_dump($params); } /** * @After() */ public function after() { echo "我是后置".PHP_EOL; } /** * @AfterReturning() * @param JoinPoint $joinPoint * @param $request Request */ public function afterrunning(JoinPoint $joinPoint) // 可以日志记录 { echo "程序执行完了".PHP_EOL; // /** @var Request $request */ // $request = $joinPoint->getArgs()[0]; // $params = $request->getBody(); // var_dump($params); return $joinPoint->getReturn(); } }
访问浏览器 结果如下
HTTP Server Start Success! 2020/07/18-19:42:54 [INFO] SwoftServerServer:startSwoole(491) SwooleRuntime::enableCoroutine 2020/07/18-19:42:54 [INFO] SwoftListenerBeforeStartListener:handle(27) Server extra info: pidFile @runtime/swoft.pid 2020/07/18-19:42:54 [INFO] SwoftListenerBeforeStartListener:handle(28) Registered swoole events: start, shutdown, managerStart, managerStop, workerStart, workerStop, workerError, request, task, finish Server start success (Master PID: 16459, Manager PID: 16464) 我是前置 array(1) { ["id"]=> string(1) "4" } 我是后置 程序执行完了
以上是关于swoft 切面AOP尝试的主要内容,如果未能解决你的问题,请参考以下文章