- 切面
- 前置切面
- 后置切面
- 环绕切面
切面
前置切面
可以在方法运行前添加切面
//在UserLogic调用saveUser,delUser方法前调用UserLogicTestAop的testBefore方法AopBuild::before(UserLogic::class)->methods(["saveUser","delUser"])->wave(UserLogicTestAop::class)->using("testBefore")->addPoint();
配置多个时会按配置顺序依次执行对应的切面写法
public function testBefore(JoinPoint $point){$args=$point->getArgs();//调用的参数$method=$point->getMethod();//对应的反射方法$obj=$point->getObj();//对应包装对象$target=$point->getTarget();//对应目标对象// $point->setArgs(array(1,2));//可以通用setArgs对传入参数进行修改trace("执行testBefore".json_encode($point));}
JoinPoint 类中包含我们需要的基本信息
同时我们可以通过setArgs修改传入参数如果代码有 return 那会直接拦截掉后续的操作直接将结果进行返回
后置切面
可以在方法运行后添加切面
//在UserLogic调用方法以save或del开头的方法前调用UserLogicTestAop的testAfter方法AopBuild::after(UserLogic::class)->methodsStart(["save","del"])->wave(UserLogicTestAop::class)->using("testAfter")->addPoint();
配置多个时会按配置顺序挨个执行对应的切面写法
public function testAfter(JoinPoint $point,$result){trace("执行testAfter").json_encode($point);$args=$point->getArgs();//调用的参数$argsMap=$point->getArgMap();//键值对类型$clazz=$point->getOriginalClass();//获取原始需要包装的类$method=$point->getMethod();//对应的反射方法$obj=$point->getObj();//对应包装对象$target=$point->getTarget();//对应目标对象$result['msg']="UserLogicTestAop将值修改了啊";return $result;}
JoinPoint 类中包含我们需要的基本信息
$result 为返回的结果 我们可以对结果进行修改,最后记得将修改后的结果返回
环绕切面
我们可以在对方法进行环绕添加切面,环绕切面可以控制是否运行
因机制问题一个方法的环绕切面只能有一个,建议使用前置,后置切面进行替代
AopBuild::before(UserLogic::class)->around(["saveUser","delUser"])->wave(UserLogicTestAop::class)->using("testAround")->addPoint();
对应的切面写法
public function testAround(JoinPoint $point){//在操作前面的活$result= $point->process($point->getArgs());//执行操作//操作后面的活trace("执行testAround");return $result;}
上一篇:AOP使用 下一篇:AopBuild
