laravel 10 中表单验证失败默认重定向,api 场景需返回 json 响应:方法一在 form request 中重写 failedvalidation 抛出 httpresponseexception;方法二在 handler.php 中拦截 validationexception 并判断 expectsjson();方法三用 validator::make 手动校验并返回 json。

在 Laravel 10 中,默认情况下,表单请求验证失败会自动重定向回上一页并携带错误信息。若你正在开发 API 或前后端分离项目(如用 Vue、React 调用后端),需要将校验失败响应改为 JSON 格式(如 422 Unprocessable Entity + 错误详情),而不是跳转。
方法一:在 Form Request 类中重写 failedValidation
这是最常用、最推荐的方式,精准控制某类请求的响应格式。
打开你的自定义请求类(例如 app/Http/Requests/StorePostRequest.php),添加以下方法:
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\JsonResponse;
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(
response()->json([
'message' => 'Validation failed',
'errors' => $validator->errors(),
], 422)
);
}
这样,当该请求类校验失败时,直接返回标准 JSON 响应,不会跳转。
方法二:全局修改(适用于全站 API 模式)
如果你整个应用都走 API 路由(如全部在 routes/api.php 中),可统一拦截验证异常。
在 app/Exceptions/Handler.php 的 render 方法中补充判断:
use Illuminate\Validation\ValidationException;
public function render($request, Throwable $exception)
{
if ($exception instanceof ValidationException && $request->expectsJson()) {
return response()->json([
'message' => 'Validation error',
'errors' => $exception->errors(),
], 422);
}
return parent::render($request, $exception);
}
注意:$request->expectsJson() 会检查请求头是否含 Accept: application/json 或 URL 带 .json 后缀。也可改用 $request->is('api/*') 做路径判断。
方法三:控制器内手动 validate(不推荐用于复杂场景)
若未使用 Form Request,而是在控制器中调用 $request->validate(...),它默认也会跳转。此时可改用 Validator::make 手动处理:
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'title' => 'required|string|max:255',
'content' => 'required|string',
]);
if ($validator->fails()) {
return response()->json([
'message' => 'Validation failed',
'errors' => $validator->errors(),
], 422);
}
// 继续业务逻辑
但这种方式失去 Form Request 的复用性与可读性,仅适合简单临时校验。
额外提醒
- 确保前端请求头包含
Accept: application/json,否则 Laravel 可能仍按 Web 流程处理 - API 路由建议统一放在
routes/api.php,并配合中间件api(已默认启用 JSON 响应支持) - 返回的
$validator->errors()是MessageBag对象,可直接->toArray()转数组,如需更友好结构可进一步封装











