laravel 10 中需重写 formrequest 的 failedvalidation 方法,抛出 httpresponseexception 并返回统一 json 格式(success=false、message、errors),确保路由走 api 中间件且响应为 json。

在 Laravel 10 中,表单请求(FormRequest)默认对 API 请求失败时返回 JSON 格式错误响应,但结构是原生的 `message` + `errors`,不带业务状态字段。要统一返回如 {"success": false, "message": "...", "errors": {...}} 这类格式,需主动干预验证失败流程。
重写 failedValidation 方法
这是最直接、最可控的方式。在自定义 FormRequest 类中覆盖该方法,手动构造并抛出标准化 JSON 响应:
- 使用
response()->json()构建结构化数据,状态码建议用422 Unprocessable Entity - 务必抛出
HttpResponseException,否则响应不会生效 -
$validator->errors()返回的是MessageBag,可直接转为数组供前端消费
示例代码:
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(
response()->json([
'success' => false,
'message' => '参数验证失败',
'errors' => $validator->errors()->toArray(),
], 422)
);
}
配合全局异常处理器统一兜底
若项目中多个 FormRequest 都需相同响应结构,可在 app/Exceptions/Handler.php 的 render 方法中拦截 HttpResponseException,避免重复编写:
- 检查异常是否由 FormRequest 抛出(可通过判断响应内容或异常来源)
- 提取原始响应内容,再包裹成统一格式(例如加
timestamp或code字段) - 注意不要影响其他类型的
HttpResponseException,如手动抛出的 404 或 500
确保请求走 API 通道而非 Web 通道
FormRequest 的响应行为取决于请求类型:
- 若控制器方法被
api中间件组包裹(如定义在routes/api.php),失败时自动返回 JSON - 若在
routes/web.php中使用,默认会重定向回表单页,并闪存错误到 session - 即使重写了
failedValidation,若未明确指定为 API 请求,仍可能触发重定向逻辑
确认方式:检查路由文件是否使用 Route::middleware('api'),或控制器方法是否显式声明了 Accept: application/json 头。
可选:结合 attributes() 方法优化字段名显示
前端看到的错误键名(如 "email")默认来自表单字段名。用 attributes() 可映射为更友好的中文名称,让错误信息更自然:
- 在 FormRequest 类中添加该方法,返回字段别名映射
- 例如:
'email' => '邮箱',后续:attribute占位符将自动替换为“邮箱” - 配合
messages()使用效果更佳,比如'email.required' => ':attribute 不能为空'











