hf3.0 AOP切面

2023-07-11  本文已影响0人  geeooooz

官方文档:https://hyperf.wiki/3.0/#/zh-cn/aop
51博客的示例:https://blog.51cto.com/u_15064646/3929186
切入类注解和类方法注解 这块没有研究

切面类
<?php
//app/Aspect/FooAspect
namespace App\Aspect;

use App\Service\SomeClass;
use App\Annotation\SomeAnnotation;
use Hyperf\Di\Annotation\Aspect;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;

#[Aspect]
class FooAspect extends AbstractAspect
{
    //1.第一种方法
    // 要切入的类或 Trait,可以多个,亦可通过 :: 标识到具体的某个方法,通过 * 可以模糊匹配
    public array $classes = [
        SomeClass::class,//代表请求这个service 中所有方法都会检测到
        'App\Service\SomeClass::someMethod',//固定方法
        'App\Service\SomeClass::*Method',//模糊匹配方法
    ];

    // 这个注解先不考虑了 注解是一大章 用到的不多
    // 要切入的注解,具体切入的还是使用了这些注解的类,仅可切入类注解和类方法注解
//    public array $annotations = [
//        SomeAnnotation::class,
//    ];

    //2.使用注解  选一种即可
    #[
        Aspect(
            classes: [
            SomeClass::class,
            "App\Service\SomeClass::someMethod",
            "App\Service\SomeClass::*Method"
        ],
            annotations: [
                SomeAnnotation::class
            ]
        )
    ]


    public function process(ProceedingJoinPoint $proceedingJoinPoint)
    {
        // 切面切入后,执行对应的方法会由此来负责
        // $proceedingJoinPoint 为连接点,通过该类的 process() 方法调用原方法并获得结果
        // 在调用前进行某些处理
        $result = $proceedingJoinPoint->process();
        var_dump($result);
        // 在调用后进行某些处理
        return '结果处理'.PHP_EOL.$result .PHP_EOL. '结果处理'.PHP_EOL;
    }

}

检测的service类
<?php


namespace App\Service;


class SomeClass
{
    public function someMethod(){
        return 1;
    }
    public function something(){
        return 'test';
    }
    public function aMetho(){
        return 2;
    }
}
demo控制器,用于访问测试
<?php


namespace App\Controller;

use App\Service\SomeClass;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;

#[Controller(prefix: "demo")]
class Demo extends AbstractController
{
    #[Inject]

    #[GetMapping(path: "demo")]
    public function demo(){
        $some = new SomeClass();
        return $some->someMethod();
    }


}
上一篇 下一篇

猜你喜欢

热点阅读