hyperf 中推荐使用 validation 组件进行控制器请求验证,支持注解(@validate)、独立验证器类(formrequest)和手动调用三种方式;注解适合简单场景,验证器类提升可复用性与可测性,手动调用则提供最大灵活性。

Hyperf 中控制器请求验证推荐使用 Validation 组件,配合注解(@Validate)或手动调用验证器,实现简洁、可复用、易维护的参数校验逻辑。
启用 Validation 组件
确保项目已安装并启用 hyperf/validation 组件:
- 执行
composer require hyperf/validation - 确认
config/autoload/dependencies.php中已注册ValidatorInterface对应实现(通常默认已配置) - 验证规则支持数组定义、PHP8.1+ 属性验证(需配合
hyperf/validationv3.1+)或自定义验证器类
在控制器中使用 @Validate 注解
这是最轻量、侵入性最小的方式,适合简单场景:
- 在控制器方法上添加
@Validate注解,传入规则数组 - 规则键名对应请求参数名(
query、body、form等),Hyperf 自动提取并校验 - 验证失败自动返回
422 Unprocessable Entity及错误信息(JSON 格式)
示例:
#[Controller]
#[Middleware(ValidationMiddleware::class)]
class UserController
{
#[PostMapping("/users")]
#[Validate([
'name' => 'required|string|min:2|max:20',
'email' => 'required|email|unique:users,email',
'age' => 'nullable|integer|min:0|max:150',
])]
public function store(RequestInterface $request)
{
return $this->response->success($request->all());
}
}
使用独立验证器类(推荐中大型项目)
将验证逻辑抽离为可复用的验证器类,提升可读性与测试性:
- 创建验证器类(如
App\Request\CreateUserRequest),继承Hyperf\Validation\Request\FormRequest - 重写
rules()方法返回规则数组,可选重写messages()定制提示语 - 在控制器方法参数中直接类型提示该类,Hyperf 自动注入并完成验证
示例:
namespace App\Request;
use Hyperf\Validation\Request\FormRequest;
class CreateUserRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => 'required|string|min:2|max:20',
'email' => 'required|email|unique:users,email',
'password' => 'required|string|min:6',
];
}
public function messages(): array
{
return [
'name.required' => '用户名不能为空',
'email.email' => '邮箱格式不正确',
];
}
}
控制器中使用:
#[PostMapping("/users")]
public function store(CreateUserRequest $request)
{
// $request->validated() 返回通过验证的数据(过滤后)
return $this->response->success($request->validated());
}
手动调用验证器(灵活控制流程)
适用于需要动态规则、条件校验或自定义响应格式的场景:
- 注入
ValidatorFactoryInterface或使用make()创建验证器实例 - 调用
validate()或fails()判断结果,手动处理成功/失败逻辑 - 注意:需自行处理异常(
ValidationException)或构造响应
示例:
public function update(RequestInterface $request, ValidatorFactoryInterface $validatorFactory)
{
$data = $request->all();
$validator = $validatorFactory->make($data, [
'id' => 'required|integer|exists:users,id',
'status' => 'required|in:active,inactive',
]);
if ($validator->fails()) {
return $this->response->fail(422, $validator->errors()->first());
}
// 执行更新...
return $this->response->success('更新成功');
}










