声明

声明切面

Aspect 类与任何其他正常的 bean 类似,并且可能像任何其他类一样拥有方法和字段,但它们将使用 @Aspect 注释,如下所示:

  1. use Swoft\Aop\Annotation\Mapping\Aspect;
  2. /**
  3. * Class DemoAspect
  4. *
  5. * @since 2.0
  6. *
  7. * @Aspect(order=1)
  8. */
  9. class DemoAspect
  10. {
  11. // ...
  12. }

@Aspect

定义一个类为切面类

  • order 优先级,多个切面,越小预先执行

声明切入点

一个切入点有助于确定不同的意见执行感兴趣的连接点(即方法)。

  1. /**
  2. * Class DemoAspect
  3. *
  4. * @since 2.0
  5. *
  6. * @Aspect(order=1)
  7. *
  8. * @PointBean(
  9. * include={"testOrderAop"}
  10. * )
  11. */
  12. class DemoAspect
  13. {
  14. // ...
  15. }

@PointBean

定义bean切入点, 这个bean类里的方法执行都会经过此切面类的代理

  • include 定义需要切入的实体名称集合
  • exclude 定义需要排除的实体名称集合

@PointAnnotation

定义注解切入点, 所有包含使用了对应注解的方法都会经过此切面类的代理

  • include 定义需要切入的注解名称集合
  • exclude 定义需要排除的注解集合

PointExecution

定义匹配切入点, 指明要代理目标类的哪些方法

  • include 定义需要切入的匹配集合,匹配的类方法,支持正则表达式
  • exclude 定义需要排序的匹配集合,匹配的类方法,支持正则表达式

@PointBean、@PointAnnotation、@PointExecution 三种定义的关系是并集,三种里面定义的排除也是并集后在排除。建议为了便于理解和使用,一个切面类尽量只使用上面三个中的一个

声明通知

  1. use Swoft\Aop\Annotation\Mapping\After;
  2. use Swoft\Aop\Annotation\Mapping\AfterReturning;
  3. use Swoft\Aop\Annotation\Mapping\AfterThrowing;
  4. use Swoft\Aop\Annotation\Mapping\Around;
  5. use Swoft\Aop\Annotation\Mapping\Aspect;
  6. use Swoft\Aop\Annotation\Mapping\Before;
  7. use Swoft\Aop\Annotation\Mapping\PointBean;
  8. use Swoft\Aop\Point\JoinPoint;
  9. use Swoft\Aop\Point\ProceedingJoinPoint;
  10. /**
  11. * Class DemoAspect
  12. *
  13. * @since 2.0
  14. *
  15. * @Aspect(order=1)
  16. *
  17. * @PointBean(
  18. * include={"testOrderAop"}
  19. * )
  20. */
  21. class DemoAspect
  22. {
  23. /**
  24. * @Before()
  25. */
  26. public function before()
  27. {
  28. // before
  29. }
  30. /**
  31. * @After()
  32. */
  33. public function after()
  34. {
  35. // After
  36. }
  37. /**
  38. * @AfterReturning()
  39. *
  40. * @param JoinPoint $joinPoint
  41. *
  42. * @return mixed
  43. */
  44. public function afterReturn(JoinPoint $joinPoint)
  45. {
  46. $ret = $joinPoint->getReturn();
  47. // After return
  48. return $ret;
  49. }
  50. /**
  51. * @Around()
  52. *
  53. * @param ProceedingJoinPoint $proceedingJoinPoint
  54. *
  55. * @return mixed
  56. */
  57. public function around(ProceedingJoinPoint $proceedingJoinPoint)
  58. {
  59. // Before around
  60. $result = $proceedingJoinPoint->proceed();
  61. // After around
  62. return $result;
  63. }
  64. /**
  65. * @param \Throwable $throwable
  66. *
  67. * @AfterThrowing()
  68. */
  69. public function afterThrowing(\Throwable $throwable)
  70. {
  71. // afterThrowing
  72. }
  73. }
  • @Before 前置通知,在目标方法执行前先执行此方法
  • @After 后置通知,在目标方法执行后执行此方法
  • @AfterReturning 最终返回通知
  • @AfterThrowing 异常通知,在目标方法执行抛出异常时执行此方法
  • @Around 环绕通知,在目标方法执行前、后都执行此方法