Laravel中如何给数量不固定的所有请求参数统一应用required和string验证规则
Laravel 动态请求参数验证解决方案
错误原因分析
你之前的写法不生效是因为将整个请求参数数组$req直接作为验证规则的键,Validator 无法识别数组类型的规则键名,自然不会执行对应的验证逻辑。
方案1:修改前端字段为数组格式(最推荐)
这是Laravel官方推荐的动态字段处理方式,验证逻辑更简洁:
前端代码调整(顺便修复原有语法错误)
@foreach ($questions as $index => $question) <div class="col-md-12"> <div class="form-group row"> <div class="col-md-4 mt-2"> <label for="form-control-label" class="d-flex justify-content-end"> <b>{{$question->description }}</b></label> </div> <div class="col-md-3"> <input type="text" name="sectionTime[]" class="form-control"> <div class="text-center"> {!! $errors->first('sectionTime.'.$index, '<strong class="text-danger">:message</strong>') !!} </div> </div> </div> </div> @endforeach
后端验证代码
$validator = Validator::make($request->all(), [ 'sectionTime' => ['required', 'array'], 'sectionTime.*' => ['required', 'string'] ]);
这种写法会自动验证sectionTime数组下的所有元素,不管数量多少都能完全覆盖。
方案2:不修改前端,动态生成验证规则
如果不想改动前端原有命名逻辑,可以先过滤出所有以sectionTime开头的请求字段,再生成对应的验证规则:
use Illuminate\Support\Str; // 过滤所有符合命名规则的字段 $fields = collect($request->keys())->filter(function ($key) { return Str::startsWith($key, 'sectionTime'); })->toArray(); // 动态生成规则数组 $rules = []; foreach ($fields as $field) { $rules[$field] = ['required', 'string']; } $validator = Validator::make($request->all(), $rules);
提示:Laravel 8.0及以上版本可以直接用PHP原生的
str_starts_with方法替换Str::startsWith,不需要额外引入Str门面。
内容的提问来源于stack exchange,提问作者Majestic99
相关产品推荐
相关产品推荐

