官方文档: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();
}
}
网友评论