本文目录导读:

在 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 错误响应。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播