hyperf 3.0 强制要求将 doctrine 风格注解(如 @controller、@getmapping、@inject 等)全部转为 php 8 attributes,因已移除 doctrine/annotations 依赖;需用 php bin/hyperf.php code:generate -d 指定目录批量转换,并手工核对多行注解、字符串引号、父类/ trait 注解及命名空间变更(如 hyperf\utils\context → hyperf\context\context)。

Hyperf 2.2 升级到 3.0 时,Doctrine 风格注解(如 @Controller、@GetMapping)必须全部转为 PHP 8 Attributes(#[Controller]、#[GetMapping]),否则启动直接报错或路由失效——这不是可选优化,而是强制要求。
为什么不能手动改?哪些注解必须转
Hyperf 3.0 完全移除了对 doctrine/annotations 的依赖,运行时不再解析 @xxx 注解。所有控制器、中间件、事件监听器、配置类中的注解都需转换,尤其注意:
-
@Controller、@RequestMapping、@GetMapping、@PostMapping等路由相关注解 -
@Inject、@Value、@Required等 DI 相关注解 -
@EventLister、@Command、@Aspect等扩展注解 - 自定义注解(如果你有基于
doctrine/annotations实现的)也得重写为 Attributes
用 php bin/hyperf.php code:generate 批量转换
Hyperf 官方提供内置命令,能自动识别并转换大部分常见注解,但需配合正确参数:
- 执行
php bin/hyperf.php code:generate -D app:扫描app/下所有 PHP 文件,将注解转为 Attributes,并保留原有逻辑结构 - 若你的控制器在
src/Controller,则改为php bin/hyperf.php code:generate -D src/Controller - 该命令不会覆盖已有 Attributes,也不会动非注解部分(比如方法体、变量声明)
- 转换后会提示“X files updated”,但不会告诉你哪一行错了——建议先在 Git 中提交当前状态,便于回滚
转换后必须手工检查的 3 类问题
脚本能处理标准写法,但以下情况它无能为力,必须人工核对:
- 多行注解换行格式错乱:例如
@GetMapping(path="info", name="user.info")转成#[GetMapping(path: 'info', name: 'user.info')]是对的,但若原写法是分行的,可能漏掉逗号或引号 - 字符串内含双引号未转义:如
@Value("${app.name:\"hyperf\"}")→ 脚本可能生成#[Value('${app.name:"hyperf"}')],而 PHP 8 Attributes 不支持变量插值,得改成#[Value('${app.name:hyperf}')]或用常量替代 - 继承类或 trait 中的注解不会被扫描到:脚本只处理当前文件声明的类,父类或引入的 trait 中的注解需单独定位修改
最易被忽略的是命名空间变更:转换后所有 use Hyperf\Utils\Context 必须改为 use Hyperf\Context\Context,且 process() 方法签名要显式加 void 返回类型——这两处不改,服务能启动但事件监听器不会触发。











