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,提问作者Александр Инженер
相关产品推荐
相关产品推荐

