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

Laravel API请求验证失败后跳转至登录页问题咨询

问题原因

Laravel 的 $this->validate() 方法会根据请求的类型返回响应:如果请求没有携带 Accept: application/json 请求头,即便用 POST 方法访问 API 路由,Laravel 也会将其判定为 Web 请求。结合路由上的 auth:api 中间件,验证失败后的异常会被处理成登录页跳转,而非返回 API 格式的验证错误。

解决方案

方案一:添加正确的请求头

在 Postman 中给请求添加 Accept: application/json 头,Laravel 会识别为 API 请求,验证失败时自动返回 JSON 格式的错误信息,不会触发跳转。

方案二:使用表单请求类替代控制器内验证

表单请求类在 API 场景下默认返回 JSON 错误,比控制器内验证更适配接口开发:

  1. 创建表单请求类:
php artisan make:request CreateOrderRequest
  1. 修改生成的 app/Http/Requests/CreateOrderRequest.php 文件:
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\ValidationException;

class CreateOrderRequest extends FormRequest
{
    public function authorize(): bool
    {
        // 路由已通过 auth:api 中间件校验权限,此处直接返回 true
        return true;
    }

    public function rules(): array
    {
        return [
            'name' => 'required',
            'phone' => 'required',
            'address' => 'required',
            'wallet_id' => 'required'
        ];
    }

    // 自定义验证失败的 JSON 响应格式
    protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
    {
        throw new ValidationException($validator, response()->json([
            'message' => '参数验证失败',
            'errors' => $validator->errors()
        ], 422));
    }
}
  1. 在控制器中使用该请求类:
class OrderController extends Controller
{
    public function createOrder(\App\Http\Requests\CreateOrderRequest $request)
    {
        // 验证通过后执行业务逻辑
        return 'something';
    }
}

方案三:重写控制器基类的验证逻辑

如果不想使用表单请求类,可以在 App\Http\Controllers\Controller 基类中重写验证方法,强制返回 JSON 响应:

use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    protected function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
    {
        $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);

        if ($validator->fails()) {
            throw new ValidationException($validator, response()->json([
                'message' => '参数验证失败',
                'errors' => $validator->errors()
            ], 422));
        }
    }
}

内容的提问来源于stack exchange,提问作者alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:20:10