Laravel请求正则验证:如何验证含数组字段的所有元素
Laravel 全局正则验证包含数组字段的实现方案
你之前用'*' => Config::get('regex.regexStr')的方式只能验证顶级的非数组字段,当请求里有数组类型字段时,因为数组本身不符合字符串正则规则,会触发验证错误,同时数组内的元素也没被校验到。可以通过以下几种方式解决:
1. 已知数组字段名时,直接指定数组元素规则
如果提前知道请求中的数组字段名称,比如tags、items,可以在验证规则中单独添加数组元素的匹配规则:
$request->validate([ // 验证所有顶级非数组字段 '*' => Config::get('regex.regexStr'), // 验证数组tags下的每个元素 'tags.*' => Config::get('regex.regexStr'), // 若有多个数组字段,依次添加 'items.*' => Config::get('regex.regexStr'), ]);
2. 未知数组字段名时,动态生成验证规则
如果无法提前确定数组字段的名称,可以遍历请求的所有字段,根据字段类型动态生成验证规则:
$regexRule = Config::get('regex.regexStr'); $rules = []; foreach ($request->all() as $field => $value) { if (is_array($value)) { // 数组字段:给每个子元素添加正则规则 $rules["{$field}.*"] = $regexRule; } else { // 普通字段:直接添加正则规则 $rules[$field] = $regexRule; } } $request->validate($rules);
3. 处理多层嵌套数组的情况
如果请求中存在多层嵌套的数组,可以通过递归函数生成全量的验证规则,确保每个层级的元素都被校验:
function buildRegexValidationRules(array $requestData, string $prefix = '', string $rule): array { $rules = []; foreach ($requestData as $key => $value) { $currentField = $prefix ? "{$prefix}.{$key}" : $key; if (is_array($value)) { // 递归处理嵌套数组 $rules = array_merge($rules, buildRegexValidationRules($value, $currentField, $rule)); // 可选:验证当前数组字段本身是合法数组 $rules[$currentField] = 'array'; } else { // 普通字段添加正则规则 $rules[$currentField] = $rule; } } return $rules; } // 生成规则并执行验证 $regexRule = Config::get('regex.regexStr'); $validationRules = buildRegexValidationRules($request->all(), '', $regexRule); $request->validate($validationRules);
内容的提问来源于stack exchange,提问作者Lune
相关产品推荐
相关产品推荐

