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

Laravel验证结果按失败规则键化的实现方法求助

实现Laravel验证错误按规则分组返回

方法一:重写Form Request的failedValidation方法

如果项目使用Laravel的Form Request做验证,直接在自定义Request类中重写failedValidation方法,即可自定义错误返回格式:

namespace App\Http\Requests;

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

class YourCustomRequest extends FormRequest
{
    // 定义验证规则
    public function rules()
    {
        return [
            'primary_email' => 'required|email|unique:users,email',
            'adults' => 'required|array|size:1',
            'children' => 'required|array|size:2',
        ];
    }

    // 自定义错误消息(可选,也可使用框架默认消息)
    public function messages()
    {
        return [
            'primary_email.unique' => 'Email already exists in SSO.',
            'adults.size' => 'The adults array must contain 1 item.',
            'children.size' => 'The children array must contain 2 items.',
        ];
    }

    // 重写验证失败后的处理逻辑
    protected function failedValidation(Validator $validator)
    {
        $errorMessages = [];
        
        // 获取每个字段的失败规则列表
        $failedRules = $validator->failed();
        
        // 遍历字段与规则,拼接目标格式的错误数组
        foreach ($failedRules as $field => $rules) {
            $fieldErrors = [];
            foreach (array_keys($rules) as $rule) {
                // 将规则名转为小写(框架返回的规则名为大写,如UNIQUE)
                $ruleKey = strtolower($rule);
                // 获取对应字段+规则的错误消息
                $fieldErrors[$ruleKey] = $validator->errors()->first("$field.$ruleKey");
            }
            $errorMessages[$field] = $fieldErrors;
        }
        
        throw new HttpResponseException(
            response()->json([
                'errorMessages' => $errorMessages
            ], 422)
        );
    }
}

方法二:控制器内手动处理验证

若不使用Form Request,可直接在控制器中创建Validator实例并手动处理错误:

use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

public function yourControllerMethod(Request $request)
{
    $rules = [
        'primary_email' => 'required|email|unique:users,email',
        'adults' => 'required|array|size:1',
        'children' => 'required|array|size:2',
    ];

    $messages = [
        'primary_email.unique' => 'Email already exists in SSO.',
        'adults.size' => 'The adults array must contain 1 item.',
        'children.size' => 'The children array must contain 2 items.',
    ];

    $validator = Validator::make($request->all(), $rules, $messages);

    if ($validator->fails()) {
        $errorMessages = [];
        $failedRules = $validator->failed();
        
        foreach ($failedRules as $field => $rules) {
            $fieldErrors = [];
            foreach (array_keys($rules) as $rule) {
                $ruleKey = strtolower($rule);
                $fieldErrors[$ruleKey] = $validator->errors()->first("$field.$ruleKey");
            }
            $errorMessages[$field] = $fieldErrors;
        }

        throw new HttpResponseException(
            response()->json(['errorMessages' => $errorMessages], 422)
        );
    }

    // 验证通过后的业务逻辑
    return response()->json(['message' => 'Validation passed']);
}

关键说明

  • $validator->failed()方法会返回字段与对应失败规则的数组,结构为['字段名' => ['失败规则名' => 规则参数]]
  • 遍历过程中将规则名转为小写,匹配对应错误消息,最终拼接成前端需要的errorMessages结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:57:24