@AutoController自动挂载所有public方法为同名路由,适合快速CRUD;@Controller需配合@GetMapping等显式注解,控制更细、更RESTful。混用易致路由静默失效。

Hyperf 的 @AutoController 和 @Controller 有什么区别?
直接用 @AutoController 是最省事的起点,它会自动挂载当前类下所有 public 方法为路由(GET/POST 同名路径),适合 CRUD 风格的快速开发;而 @Controller 必须配合 @GetMapping、@PostMapping 等显式注解,控制粒度更细,也更符合 RESTful 规范。
常见错误是混用:比如加了 @Controller 却忘了写任何 HTTP 方法注解,结果路由完全不注册——Hyperf 不会报错,只是静默忽略该方法。
-
@AutoController(prefix="/user")→ 自动绑定/user/index、/user/create等路径 -
@Controller("/user")+@GetMapping("/profile")→ 绑定/user/profile,其他方法不生效 - 方法必须是
public,否则注解扫描时直接跳过
为什么 @GetMapping 写了却 404?检查这三处
不是注解没生效,而是 Hyperf 路由注册依赖「类被容器扫描到」,而扫描失败往往藏在细节里。
- 控制器类必须放在
app/Controller目录下(或你配置的scan.directory路径中),且命名以Controller结尾,如UserController -
composer.json中的autoload配置要包含该目录,例如:"psr-4": {"App\": "app/"} - 修改注解后必须执行
php bin/hyperf.php gen:controller或清空runtime/container缓存,否则旧路由表仍生效
@RequestMapping 的 methods 参数怎么填才不出错?
别写字符串数组字面量,Hyperf 注解只认常量引用。写成 methods={"GET"} 会解析失败,路由注册为空。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法是
methods={RequestMethod::GET},需 useHyperfHttpServerAnnotationRequestMethod - 支持组合:
methods={RequestMethod::GET, RequestMethod::HEAD} - 如果只写
@RequestMapping("/api")不带methods,默认接受全部方法(含危险的PUT、DELETE),生产环境务必显式限定
自定义注解路由前缀影响全局配置吗?
不影响。Hyperf 的路由前缀是「类级注解 + 方法级注解」拼接而成,且只作用于当前控制器,不会污染其他模块。
但要注意嵌套前缀的拼接逻辑:比如 @Controller("/v1") 加上方法上 @GetMapping("/users/{id}"),最终路径是 /v1/users/{id};如果方法上又写了 @GetMapping("/api/users"),那前缀就变成 /v1/api/users —— 这种重复拼接容易导致路径冗长或语义混乱。
- 推荐统一在
@Controller设一级业务前缀(如/user、/order) - 方法级注解只写资源动作部分(如
/list、/{id}/detail) - 避免在方法路径里再写斜杠开头,如
@GetMapping("/user/info")(双斜杠会导致路径变成//user/info)
runtime/container 没清,或者类没进 PSR-4 自动加载范围。



















