• 声明
    • 声明切面
      • @Aspect
    • 声明切入点
      • @PointBean
      • @PointAnnotation
      • PointExecution
    • 声明通知

    声明

    声明切面

    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 环绕通知,在目标方法执行前、后都执行此方法