@AutoController 是最简起点,它自动为所有 public 方法生成 GET/POST 路由,如 listUsers() → /list-users,支持 prefix 统一前缀,但不支持方法类型限定或路径参数。

Hyperf 注解路由本身不冗长,真正导致“繁琐”的是配置遗漏、注解混用或路径写法不当——只要扫清这三处障碍,@AutoController 一行就能撑起整个控制器路由。
为什么 @AutoController 是最简起点
它自动为控制器所有 public 方法生成路由,无需逐个加 @GetMapping,也不用写重复前缀。适合快速验证逻辑、MVP 开发或内部工具类服务。
-
@AutoController默认按方法名生成小写蛇形路径:比如listUsers()→/list-users - 加
prefix参数统一加前缀:#[AutoController(prefix: '/api/v1')],后续所有方法自动挂载在该路径下 - 不支持混合 HTTP 方法(所有方法默认接受 GET 和 POST),如需精确控制方法类型,必须换用
@Controller+@RequestMapping - 若方法名含大写字母但没用驼峰转连字符规则(如
getUserInfo),实际路由会是/get-user-info,不是/getUserInfo—— 这是反射解析时的固定行为,无法关闭
@Controller + @GetMapping 的精简写法
当需要限定请求方法、带路径参数或复用前缀时,@Controller 更可控,但容易因手误多写几行。
- 前缀写在类上,路径写在方法上,避免重复:
#[Controller(prefix: '/users')]+#[GetMapping(path: '{id}')]→ 实际匹配/users/{id} - 别写
path: '/users/{id}',否则变成/users/users/{id}—— 前缀和路径会拼接,斜杠只留一处 - 路径参数类型提示可省略,但建议显式声明:
public function show(int $id)比public function show($id)更安全,Hyperf 会自动校验并返回 400 -
@GetMapping不支持逗号分隔多个路径,要定义多个路由得写多个注解,不能偷懒写成#[GetMapping(path: ['a', 'b'])]
动态通配路由怎么写才不踩坑
要捕获类似 /qq_367143/article/details/1494436 这种整段路径,别用 {*path} —— Hyperf 3.x 不识别这种写法,那是 Laravel 风格。
- 正确方式是用 fast-route 原生语法:
#[GetMapping(path: '/{path:.+}')],其中.+表示匹配一个及以上任意字符 - 若想匹配空路径也生效,改用
{path:.*},但要注意它可能覆盖其他静态路由,优先级低于具体路径 - 参数名必须与占位符一致:
public function catchAll(string $path),变量名$path不能写成$slug,否则注入失败,值为null - 域名级路由限制不在注解里做,得去
config/autoload/server.php配virtual_hosts,注解只管路径层
route:list 看不到路由?先查这三件事
注解路由不生效,90% 是扫描环节断了,而不是注解写错了。
- 确认
config/autoload/annotations.php中'scan' => true且'paths'包含你的控制器目录,例如['app/Controller'] - 运行
composer dump-autoload—— 注解扫描依赖自动加载映射,改完控制器不重刷 autoload 就扫不到新类 - 检查类命名空间是否正确:控制器必须在
App\Controller下(或你配置的扫描路径对应命名空间),namespace App\Controller;少一个分号或拼错都会让扫描器跳过 -
php bin/hyperf.php route:list输出为空,但服务能启动,说明注解机制根本没触发;此时看日志里有没有AnnotationCollector::collect相关记录,没有就证明扫描被跳过了
最常被忽略的是 autoload 未刷新和路径正则表达式写错 —— 写 {id:\d+} 却传了字母,不会报错,只是匹配失败进 404,看起来像路由没注册。



















