### 前置切面 * * * * * 可以在方法运行前添加切面 ``` //在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; } ```