Laravel验证失败返回JSON吗

wen PHP项目 2

本文目录导读:

Laravel验证失败返回JSON吗

  1. 自动返回 JSON 的情况
  2. 返回重定向的情况
  3. 手动控制返回格式
  4. 强制返回 JSON
  5. 自定义验证异常处理
  6. 判断原则

在 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 错误响应。

抱歉,评论功能暂时关闭!