切面

前置切面


可以在方法运行前添加切面

  1. //在UserLogic调用saveUser,delUser方法前调用UserLogicTestAop的testBefore方法
  2. AopBuild::before(UserLogic::class)
  3. ->methods(["saveUser","delUser"])
  4. ->wave(UserLogicTestAop::class)
  5. ->using("testBefore")
  6. ->addPoint();

配置多个时会按配置顺序依次执行对应的切面写法

  1. public function testBefore(JoinPoint $point){
  2. $args=$point->getArgs();//调用的参数
  3. $method=$point->getMethod();//对应的反射方法
  4. $obj=$point->getObj();//对应包装对象
  5. $target=$point->getTarget();//对应目标对象
  6. // $point->setArgs(array(1,2));//可以通用setArgs对传入参数进行修改
  7. trace("执行testBefore".json_encode($point));
  8. }

JoinPoint 类中包含我们需要的基本信息

同时我们可以通过setArgs修改传入参数如果代码有 return 那会直接拦截掉后续的操作直接将结果进行返回

后置切面


可以在方法运行后添加切面

  1. //在UserLogic调用方法以save或del开头的方法前调用UserLogicTestAop的testAfter方法
  2. AopBuild::after(UserLogic::class)
  3. ->methodsStart(["save","del"])
  4. ->wave(UserLogicTestAop::class)
  5. ->using("testAfter")
  6. ->addPoint();

配置多个时会按配置顺序挨个执行对应的切面写法

  1. public function testAfter(JoinPoint $point,$result){
  2. trace("执行testAfter").json_encode($point);
  3. $args=$point->getArgs();//调用的参数
  4. $argsMap=$point->getArgMap();//键值对类型
  5. $clazz=$point->getOriginalClass();//获取原始需要包装的类
  6. $method=$point->getMethod();//对应的反射方法
  7. $obj=$point->getObj();//对应包装对象
  8. $target=$point->getTarget();//对应目标对象
  9. $result['msg']="UserLogicTestAop将值修改了啊";
  10. return $result;
  11. }

JoinPoint 类中包含我们需要的基本信息

$result 为返回的结果 我们可以对结果进行修改,最后记得将修改后的结果返回

环绕切面


我们可以在对方法进行环绕添加切面,环绕切面可以控制是否运行

因机制问题一个方法的环绕切面只能有一个,建议使用前置,后置切面进行替代
  1. AopBuild::before(UserLogic::class)
  2. ->around(["saveUser","delUser"])
  3. ->wave(UserLogicTestAop::class)
  4. ->using("testAround")
  5. ->addPoint();

对应的切面写法

  1. public function testAround(JoinPoint $point){
  2. //在操作前面的活
  3. $result= $point->process($point->getArgs());//执行操作
  4. //操作后面的活
  5. trace("执行testAround");
  6. return $result;
  7. }

上一篇:AOP使用   下一篇:AopBuild