hyperf 中不存在 @getmapping,正确注解是 #[get],需配合 #[controller] 或 #[autocontroller] 使用,用于声明 get 路由,语义等价于 spring 的 @getmapping。

Hyperf 中 @GetMapping 是什么?它根本不存在
Hyperf 没有 @GetMapping 这个注解。这是 Spring Boot 的写法,直接照搬会报错:Class "GetMapping" not found 或注解被忽略。Hyperf 使用的是 Swoole 驱动的协程 HTTP 服务,路由定义方式完全不同。
Hyperf 正确声明 GET 路由的两种方式
Hyperf 通过 @Controller + @RequestMapping(或更细粒度的 @Get)组合实现,核心是 @Get 注解 —— 它才是对应 Spring @GetMapping 的语义等价物。
-
@Get必须和@Controller(或@AutoController)配合使用,单独用无效 - 路径前缀由
@Controller("/api")定义,具体方法路径拼在后面,例如@Get("/users")→ 完整路由为GET /api/users - 不推荐只用
@RequestMapping(method="GET"),虽然可行,但语义不如@Get清晰,且容易漏写method
#[Controller]
class UserController
{
#[Get("/users")]
public function list(): array
{
return ['data' => []];
}
}
参数绑定与常见踩坑
Hyperf 的 @Get 支持路径参数、查询参数自动注入,但规则和 Spring 不同:路径参数必须显式声明类型并加 #[Param],查询参数则可直接作为方法参数(需类型提示)。
- 路径参数如
/users/{id},必须写成#[Param] int $id,否则值为null或触发类型错误 - 查询参数如
?page=1&size=10,可直接声明int $page = 1, int $size = 20,Hyperf 自动解析并转换类型 - 如果参数名和查询键不一致,用
#[Query("page_num")] int $page显式映射 - 不要在
@Get方法里用$this->request->get()手动取参 —— 失去类型安全和验证能力
为什么 @Get 方法返回数组会出 JSON?
Hyperf 默认启用 JsonResponse 自动封装:只要控制器方法返回数组、对象或实现了 JsonSerializable,框架就会自动调用 json_encode 并设置 Content-Type: application/json。这不是 magic,而是由 Hyperf\HttpServer\Contract\ResponseInterface 的默认行为决定的。
- 若需返回纯字符串或自定义响应,显式返回
$this->response->success('ok')或$this->response->raw(...) - 全局关闭自动 JSON 包装会影响所有控制器,不建议;应按需控制返回值类型
- 注意协程上下文:不要在
@Get方法里同步阻塞(如sleep()),否则整个 worker 进程卡住
真正容易被忽略的是注解扫描范围 —— 确保你的控制器类在 config/autoload/scan.php 的 paths 列表里,否则 @Get 根本不会被注册进路由表。











