官网文档 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"
}
我是后置
程序执行完了