• 切面
    • 前置切面
    • 后置切面
    • 环绕切面

    切面

    前置切面


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

    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