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