切面
定义切面(Aspect)
根据官方教程定义一个切面。可以指定类、方法、参数和注解上生效。
<?php
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
{
// 要切入的类或 Trait,可以多个,亦可通过 :: 标识到具体的某个方法,通过 * 可以模糊匹配
public $classes = [
SomeClass::class,
'App\Service\SomeClass::someMethod',
'App\Service\SomeClass::*Method',
];
// 要切入的注解,具体切入的还是使用了这些注解的类,仅可切入类注解和类方法注解
public $annotations = [
SomeAnnotation::class,
];
public function process(ProceedingJoinPoint $proceedingJoinPoint)
{
// 切面切入后,执行对应的方法会由此来负责
// $proceedingJoinPoint 为连接点,通过该类的 process() 方法调用原方法并获得结果
// 在调用前进行某些处理
$result = $proceedingJoinPoint->process();
// 在调用后进行某些处理
return $result;
}
}
在例子里面,$proceedingJoinPoint 有以下方法
getAnnotationMetadata
获取注解里的内容
getArguments
获取切入方法的参数
getReflectMethod
获取反射出来的方法
$method = $proceedingJoinPoint->getReflectMethod()
返回是一个数组,分别是类名和方法名。
getInstance
获取hyperf 实例
注解
<?php
declare(strict_types=1);
namespace App\Annotation;
use Hyperf\Di\Annotation\AbstractAnnotation;
/**
* @Annotation
* @Target("ALL")
*/
class Api extends AbstractAnnotation
{
}
注解一共有 3 种应用对象,分别是 类
、类方法
和 类属性
。
其中 @Target
有如下参数:
-
METHOD
注解允许定义在类方法上 -
PROPERTY
注解允许定义在类属性上 -
CLASS
注解允许定义在类上 -
ALL
注解允许定义在任何地方
多个时:
/**
* @Annotation
* @Target({"METHOD", "CLASS"})
*/