hyperf 路由参数绑定通过注解自动映射 url 变量为方法参数,支持类型转换、多参数、可选参数(靠右)、正则约束(如{id:\d+})及 dto 手动赋值,要求参数名大小写一致且不可省略 php 类型声明。

Hyperf 的路由参数绑定主要通过注解(@GetMapping、@PostMapping 等)配合控制器方法参数自动完成,无需手动解析 $request->route()->parameter('id') 这类操作。核心是让框架自动把 URL 中的变量映射为方法参数值。
基础路径参数绑定
在路由注解中用 {id} 定义占位符,方法参数名与占位符一致即可自动注入:
- URL 示例:
/user/123 - 代码写法:@GetMapping("/user/{id}"),方法参数写
public function show(int $id) - Hyperf 会自动尝试类型转换(如
int、string、bool),失败则抛出InvalidArgumentException
支持多参数与可选参数
多个参数直接并列写,可选参数需加问号,并在方法中设默认值:
@GetMapping("/post/{year}/{month?}/{day?}")- 对应方法:
public function list(int $year, int $month = 1, int $day = 1) - 注意:可选参数必须靠右,且不能跳过中间参数(即
{month?}后不能再跟必填参数)
自定义正则约束(限制匹配格式)
避免非法输入(如 ID 传入字母),可在占位符后加正则表达式:
-
@GetMapping("/user/{id:\d+}")→ 只匹配纯数字 -
@GetMapping("/article/{slug:[a-z0-9\-]+}")→ 匹配短横线分隔的英文小写+数字 - 不满足正则时,路由直接不匹配,返回 404
绑定到对象属性(DTO 绑定)
适合复杂参数场景,用 @Query、@Body 或自定义注解配合 DTO 类,但路径参数本身不支持直接绑定到对象属性。如需结构化处理,建议:
- 路径参数仍用基础类型接收(如
int $id) - 再在方法内实例化 DTO 并赋值:
$dto = new UserUpdateDto(); $dto->id = $id; - 若坚持统一入口,可用 AOP 或中间件预处理,但非官方推荐做法
不复杂但容易忽略:参数名大小写必须完全一致,且 PHP 类型声明不可省略(否则无法触发自动转换)。











