You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Sanctum中$request->validate校验失败不返回JSON问题咨询

问题原因

该现象是 Laravel 框架的默认响应逻辑,不属于运行报错,所以即使开启 Debug 模式,日志中也不会有相关报错记录。具体触发逻辑如下:

  • Laravel 会根据请求的 Accept 头判断客户端期望的响应格式:如果请求头没有携带 Accept: application/json,Laravel 会判定为普通网页请求,校验失败后默认执行重定向逻辑(通常跳转到首页或上一页),不会返回 JSON 格式的错误信息
  • 若该路由定义在 routes/web.php 中,默认挂载的 web 中间件组自带页面重定向逻辑,也会导致该问题出现
解决方案
  • 方案1:调整请求配置
    所有调用该接口的请求,必须在请求头中添加 Accept: application/json,该配置是前后端 API 对接的标准规范,配置后 Laravel 在校验失败时会自动返回 422 状态码的 JSON 格式错误信息
  • 方案2:调整路由定义
    将该 Sanctum token 生成路由从 routes/web.php 移动到 routes/api.php 中,api 路由组默认会优先返回 JSON 格式响应,无需额外配置即可获得符合预期的错误返回
  • 方案3:自定义校验逻辑(无需修改请求或路由配置)
    替换原有自动校验逻辑,手动返回指定格式的验证错误,修改后的代码如下:
Route::post('/sanctum/token', function (Request $request) {
    // 手动创建校验实例
    $validator = Validator::make($request->all(), [
        'email' => 'required|email',
        'password' => 'required',
        'device_name' => 'required',
    ]);

    // 校验失败直接返回JSON错误
    if ($validator->fails()) {
        return response()->json($validator->errors(), 422);
    }

    $user = User::where('email', $request->email)->first();

    if (! $user || ! Hash::check($request->password, $user->password)) {
        return response()->json([
            'email' => ['The provided credentials are incorrect.'],
        ], 422);
    }

    return $user->createToken($request->device_name)->plainTextToken;
});

内容的提问来源于stack exchange,提问作者Александр Инженер

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:18:03