Hyperf 的 AOP 通过注解+切面类+容器注入实现,需启用扫描与组件、定义注解、编写实现 AspectInterface 的切面类并指定规则与 process 逻辑,最后在方法上使用注解触发。

Hyperf 中的 AOP(面向切面编程)主要通过注解 + 切面类 + 注入容器的方式实现,核心是拦截方法调用,在不修改业务代码的前提下统一处理日志、权限、事务、监控等横切关注点。
一、启用 AOP 支持
Hyperf 默认未开启 AOP,需手动启用:
- 在 config/autoload/annotations.php 中确保扫描路径包含你的切面类和被拦截的控制器/服务类;
- 确认 config/autoload/dependencies.php 已注册
Hyperf\Aop\AspectContainer; - 启动时需加载 AOP 组件:确保
hyperf/aop已安装,并在composer.json的require中存在。
二、定义自定义注解
切面行为通常由注解触发。例如定义一个 @LogExecutionTime:
- 新建注解类
App\Annotation\LogExecutionTime,继承Hyperf\Di\Annotation\AbstractAnnotation; - 加上
@Target({Target::CLASS, Target::METHOD})表明可作用于类或方法; - 注解本身不执行逻辑,只作为标记,供切面类识别。
三、编写切面类
切面类需实现 Hyperf\Aop\Contract\AspectInterface,并指定拦截规则:
-
getRules()返回匹配表达式,如"execution(* App\Controller\*.*)"或结合注解:"@annotation(App\Annotation\LogExecutionTime)"; -
process(ProceedingJoinPoint $proceedingJoinPoint)是核心逻辑:可记录开始时间 → 执行原方法 → 记录耗时 → 写入日志; - 务必调用
$proceedingJoinPoint->process()否则目标方法不会执行。
四、使用示例(打日志+计时)
在控制器方法上加注解:
```phpnamespace App\Controller;
use App\Annotation\LogExecutionTime;
class UserController
{
#[LogExecutionTime]
public function index()
{
return ['data' => 'ok'];
}
}
```
配合对应切面类,每次调用 index 就会自动输出执行耗时,无需侵入业务代码。











