需通过AOP机制实现非侵入式横切逻辑:一、启用AOP组件,安装依赖并配置扫描路径与容器注册;二、定义自定义注解作为拦截标记;三、编写切面类实现环绕增强;四、配置切入规则精确匹配目标;五、清除代理缓存并验证生效。

如果您希望在Hyperf应用中为业务方法注入非侵入式横切逻辑(如日志记录、耗时统计、权限校验),则需通过AOP机制实现功能织入。以下是具体实施步骤:
一、启用AOP组件支持
Hyperf默认未激活AOP功能,必须显式安装依赖并配置扫描路径与容器注册,否则切面类不会被加载和识别。
1、执行命令安装核心包:composer require hyperf/aop hyperf/di hyperf/logger
2、确认config/autoload/annotations.php中scan配置包含切面类所在目录,例如App\Aspect和App\Annotation
3、检查config/autoload/dependencies.php已注册Hyperf\Aop\AspectContainer::class
4、确保composer.json的require区块存在"hyperf/aop": "^3.0"及以上版本
二、定义自定义注解
注解作为切面触发的标记,用于声明哪些类或方法应被拦截,其本身不包含执行逻辑,仅提供元数据支撑。
1、创建文件app/Annotation/Trace.php
2、继承Hyperf\Di\Annotation\AbstractAnnotation并添加#[Attribute]属性
3、设置Attribute::TARGET_METHOD | Attribute::TARGET_CLASS目标类型
4、声明构造参数如public readonly string $name、public readonly int $slowMs等用于运行时读取
三、编写切面类
切面类是AOP逻辑的核心载体,通过实现环绕增强控制目标方法执行流程,在不修改原业务代码的前提下插入前置、后置及异常处理逻辑。
1、创建文件app/Aspect/TraceAspect.php
2、类上添加#[Aspect]注解以启用自动注册
3、定义$annotations = [Trace::class]数组声明拦截该注解
4、在process(ProceedingJoinPoint $proceedingJoinPoint)中调用$proceedingJoinPoint->process()执行原方法
5、在调用前后分别插入计时、内存采集、参数记录等逻辑,并通过Psr\Log\LoggerInterface写入日志
四、配置切入规则
切面生效依赖精确的目标匹配策略,可通过类名、方法名或注解三种方式指定拦截范围,模糊匹配支持通配符提升复用性。
1、在切面类中声明$classes数组,例如IndexController::class.'::index'切入单个方法
2、使用'App\Controller\*Controller::*'匹配所有控制器下的所有方法
3、添加'App\Service\SomeService::*Method'匹配以Method结尾的方法名
4、若同时使用注解方式,需确保$annotations中包含对应注解类,且目标类/方法已实际标注
五、清除代理缓存并验证
Hyperf在运行时为被拦截类动态生成代理类并缓存至runtime/container/proxy/目录,任何切面或注解变更均需清除缓存才能生效。
1、执行命令删除缓存:rm -rf runtime/container/proxy/
2、重启服务使新切面加载:php bin/hyperf.php start
3、向已标注#[Trace]的接口发起请求,观察日志是否输出耗时、内存等信息
4、检查返回内容是否被切面修改(如添加前缀/后缀),确认$proceedingJoinPoint->process()调用正确



















