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

如何在Laravel自定义Form Request中获取验证错误数据

问题分析与解决办法

问题根源

你遇到的405错误,本质是Laravel默认的验证失败处理逻辑导致的:当Form Request验证不通过时,Laravel会对web请求执行重定向操作,但你的接口是返回JSON的API请求,重定向会用GET方法访问原本只允许POST的路由,因此触发“方法不允许”错误。另外,你控制器里的if ($request->validated())逻辑其实没用——validated()方法在验证失败时会直接抛出异常,根本走不到else分支。

解决办法

办法1:用请求头触发JSON响应

发送POST请求时,带上Accept: application/json请求头,Laravel会自动识别这是JSON请求,验证失败时直接返回包含错误信息的JSON响应,不用改代码。

办法2:重写Form Request的失败处理逻辑

在你的Signin请求类里,添加failedValidation方法,强制返回JSON错误:

<?php

namespace App\Http\Requests\Auth;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

class Signin extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get custom messages for validator errors.
     *
     * @return array<string, mixed>
     */
    public function messages()
    {
        return [
            'email.required' => 'Email field is required.'
        ];
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            'email' => 'required',
            'password' => 'required'
        ];
    }

    // 新增验证失败处理方法
    protected function failedValidation(Validator $validator)
    {
        throw new HttpResponseException(response()->json([
            'error' => $validator->errors()
        ], 422));
    }
}

同时控制器代码可以简化,因为验证通过才会走到这里:

public function signin(Signin $request)
{
    return response()->json(['hello' => 'hi']);
}

办法3:确认路由定义正确

检查你的路由是不是用POST方法定义的,比如在routes/api.php里:

Route::post('/signin', [YourController::class, 'signin']);

要是在routes/web.php里定义,也得确保没限制错误的请求方法。

这样修改后,参数不全时就会返回错误信息的JSON,不会再出现405错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:45:36