Hyperf 路由参数验证需手动校验或通过注解+AOP实现,因 FormRequest 默认只校验请求体和查询参数,不校验路径参数{id}等,否则存在安全隐患。

Hyperf 路由参数验证主要靠 FormRequest 类 + ValidationMiddleware 中间件配合实现,不是直接在路由定义里写规则,而是把校验逻辑收口到请求类中,清晰、可复用、支持错误自动拦截和格式化返回。
一、启用验证中间件
验证功能依赖 hyperf/validation 组件,需先安装并注册全局中间件:
- 执行
composer require hyperf/validation - 在
config/autoload/middlewares.php中为httpServer 添加中间件:\Hyperf\Validation\Middleware\ValidationMiddleware::class - 同时配置异常处理器,在
config/autoload/exceptions.php中加入:\Hyperf\Validation\ValidationExceptionHandler::class(对应http分组)
二、定义表单请求验证类
使用命令快速生成请求类(推荐放在 app/Request 目录):
php bin/hyperf.php gen:request UserUpdateRequest
编辑生成的类,填写规则和提示字段:
-
rules()返回关联数组,键为参数名,值为规则字符串(如'id' => 'required|integer|min:1') -
attributes()定义参数别名,用于错误提示更友好(如'id' => '用户ID') - 若需自定义错误消息,可重写
messages()方法
三、在控制器中使用验证类
控制器方法参数直接类型提示该 Request 类,框架会自动触发校验:
public function update(UserUpdateRequest $request, int $id)
{
// $id 是路由参数(如 PUT /users/{id}),$request 包含已校验的 body/query 参数
$data = $request->validated();
// 后续业务逻辑
}
注意:路由参数(如 {id})默认不参与 FormRequest 校验,需手动校验或结合注解/AOP。
四、校验路由参数的实用方案
当需要对 {id}、{slug} 等路径参数做严格校验时,有以下两种主流方式:
-
手动校验:在控制器开头用
$this->validationFactory创建验证器,例如:$validator = $this->validationFactory->make(['id' => $id], ['id' => 'required|integer|exists:users,id']);
若失败调用$validator->validate()会抛出异常,被中间件捕获 -
注解 + AOP 切面:自定义
@ValidateParams注解,在切面中统一提取路由参数并校验,适合多接口复用场景
不复杂但容易忽略:路由参数和请求体参数是两套输入源,FormRequest 只管后者;前者需显式接入验证流程,否则可能绕过校验导致安全隐患。











