本文目录导读:

在 Laravel 中,验证失败默认会返回 JSON 响应,但取决于请求的类型:
自动返回 JSON 的情况
当请求来自 API 或 Ajax 时
// API 路由或 ajax 请求会自动返回 JSON
Route::post('/api/users', function (Request $request) {
$request->validate([
'name' => 'required|string',
'email' => 'required|email|unique:users',
]);
// 如果验证失败,自动返回 422 JSON 响应
});
// 返回示例:
{
"message": "给定的数据无效。",
"errors": {
"name": ["名字 字段是必需的。"],
"email": ["邮箱 字段是必需的。"]
}
}
返回重定向的情况
普通 Web 请求(非 Ajax)
// Web 路由
Route::post('/users', function (Request $request) {
$request->validate([
'name' => 'required',
]);
// 验证失败会重定向回上一页,并带错误信息
});
手动控制返回格式
使用自定义请求类
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|string',
'email' => 'required|email|unique:users',
];
}
// 如果请求期望 JSON,返回 JSON;否则返回重定向
public function failedValidation(Validator $validator)
{
if ($this->expectsJson()) {
throw new ValidationException($validator);
}
parent::failedValidation($validator);
}
}
强制返回 JSON
// 方法1:设置请求头
fetch('/api/users', {
method: 'POST',
headers: {
'Accept': 'application/json', // 重要!
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
// 方法2:在控制器中手动返回
$validator = Validator::make($request->all(), [
'name' => 'required|string',
'email' => 'required|email',
]);
if ($validator->fails()) {
return response()->json([
'message' => '验证失败',
'errors' => $validator->errors()
], 422);
}
自定义验证异常处理
在 App\Exceptions\Handler.php 中:
public function register()
{
$this->renderable(function (ValidationException $e, $request) {
if ($request->expectsJson()) {
return response()->json([
'message' => '验证失败',
'errors' => $e->errors()
], 422);
}
// Web 请求保持默认行为
return redirect()->back()
->withInput()
->withErrors($e->errors());
});
}
判断原则
Laravel 通过 $request->expectsJson() 方法判断:
- ✅ 返回 JSON 的请求:API 路由、Ajax 请求、带
Accept: application/json头 - ❌ 返回重定向:普通 Web 表单提交(HTML)
如果你的前端是 SPA(如 Vue/React),只要发送正确的请求头,Laravel 会自动返回 JSON 错误响应。