Laravel 11表单请求验证:要求数组必须包含ref为A的车辆
Laravel表单请求验证:确保至少存在一辆ref为"A"的车辆并保留所有错误信息
你之前直接抛出异常会中断验证流程,导致其他错误无法被收集。下面提供两种标准解决方案,让所有验证错误都能被统一返回:
方法一:自定义闭包验证规则
直接在rules()方法中为form.vehicles添加闭包规则,让Laravel验证系统统一处理所有逻辑:
public function rules() { return [ 'form.vehicles' => [ 'required', function ($attribute, $value, $fail) { // 检查车辆列表中是否存在ref为"A"的项 $hasRequiredRef = collect($value)->contains(function ($vehicle) { return isset($vehicle['ref']) && $vehicle['ref'] === 'A'; }); if (!$hasRequiredRef) { $fail('至少需要一辆ref为"A"的车辆'); } }, ], 'form.vehicles.*.ref' => 'required|in:A,B,C,D', ]; }
这种方式将所有验证逻辑集中在一处,所有错误会自动被收集到MessageBag,最终一起返回给前端。
方法二:验证后置钩子
如果需要在基础验证完成后再执行额外检查,可以重写withValidator()方法添加后置钩子:
public function withValidator($validator) { $validator->after(function ($validator) { // 仅在基础验证通过后执行检查 if (!$validator->failed()) { $vehicles = $this->input('form.vehicles'); $hasARef = collect($vehicles)->contains(fn($vehicle) => $vehicle['ref'] === 'A'); if (!$hasARef) { // 将错误添加到错误集合 $validator->errors()->add('form.vehicles', '至少需要一辆ref为"A"的车辆'); } } }); } // 原有规则保持不变 public function rules() { return [ 'form.vehicles' => 'required', 'form.vehicles.*.ref' => 'required|in:A,B,C,D', ]; }
补充说明
你之前的in_array('A', $this->input('form.vehicles.*.ref'))写法存在问题,$this->input('form.vehicles.*.ref')无法正确提取所有车辆的ref数组,正确的判断方式应该用集合的contains()或pluck()方法实现。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

