Hyperf 路由参数默认必填,写法为 {id} 或 {id:\d+};{id?} 不被 FastRoute 支持,会报错或 404;带正则的必填参数需显式约束格式,控制器中参数仍为 string 类型,须手动校验或转换。

Hyperf 路由参数标记为必填的写法
Hyperf 的路由参数默认就是必填的,不需要额外标记 —— 只要你在路由定义里写了 {id} 这种占位符,且没加问号或默认值,它就强制要求匹配。很多人误以为要像 Laravel 那样加 ? 或用 ->required(),其实 Hyperf 不支持这种语法。
为什么 {id?} 会报错或不生效
Hyperf 的 Router 底层基于 FastRoute,只支持固定格式的占位符(如 {id}、{name:\w+}),不识别 {id?} 这类可选语法。一旦写了 ?,FastRoute 会直接解析失败,启动时报错 Invalid route pattern 或请求 404。
-
{id?}→ 错误,FastRoute 不认 -
{id}→ 正确,必填 -
{id:\d+}→ 正确,带正则约束的必填参数 - 想“模拟可选”,得靠两个路由规则或控制器内判空
带正则约束的必填参数怎么写
实际项目中,多数“必填参数”还需要校验格式,比如只接受数字 ID 或 UUID。这时必须显式加正则,否则 {id} 会匹配任意非斜杠字符串(包括空字符串或非法字符)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
示例:
// 正确:只接受纯数字,且非空
$router->get('/user/{id:\d+}', 'App\Controller\UserController::view');
// 正确:UUID 格式(注意转义花括号)
$router->get('/order/{id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}', 'App\Controller\OrderController::detail');
// 错误:{id} 没约束,/user/ 也会被匹配(实际会 404,但语义不清)
$router->get('/user/{id}', 'App\Controller\UserController::view');
控制器里怎么安全取参
即使路由写了 {id:\d+},Hyperf 也不会自动把参数转成整型 —— 它始终是 string 类型。如果控制器方法类型声明为 int $id,PHP 8+ 会抛 TypeError;不声明则需手动 intval() 或验证。
- 别依赖 PHP 参数类型自动转换,Hyperf 不做隐式 cast
- 推荐在 Controller 方法里用
filter_var($id, FILTER_VALIDATE_INT)做二次校验 - 如果用
@GetMapping注解,参数名必须和路由占位符完全一致(大小写敏感)
容易被忽略的一点:Hyperf 的路由参数名和控制器形参名是严格绑定的,改一个不改另一个就会收不到值,且无任何提示 —— 它只是静默传 null 或空字符串。


















