Laravel中如何验证datetime数组?嵌套验证规则失效排查
核心问题定位
你的验证逻辑失效的根本原因是规则数组的嵌套写法错误,导致校验规则根本没有被Laravel加载执行。
- 你编写的
$rules = array([...])会在规则外层多包裹一层无意义的数组,最终生成的规则结构是:
// 实际生成的错误规则结构 [ 0 => [ 'prazos' => 'required|array', 'prazos.*' => 'nullable|date' ] ]
- Laravel验证器只会读取规则数组顶层的字段键,把上面结构里的
0当成需要校验的目标字段名,完全不会识别嵌套在0下面的prazos、prazos.*配置。此时验证器相当于没有给prazos字段配置任何校验规则,自然不会拦截提交的乱码内容,非法值会被原样带到后续的数据库操作环节。
两种验证调用方式的逻辑差异
手动创建验证器和$request->validate()的校验引擎完全一致,不存在对数组类型数据的兼容差异:
$request->validate($rules)是对验证器的封装实现,校验失败时会自动触发重定向返回错误、携带表单输入值,校验通过会直接返回经过规则过滤的合法数据。你之前用这个方法返回空值,同样是因为规则嵌套错误,匹配不到任何需要校验的字段。Validator::make()是手动实例化验证器的方式,不会自动处理校验失败后的跳转逻辑,需要你手动判断验证结果、处理错误响应,只要规则配置正确,校验结果和前者完全没有区别。
修正后的可运行代码
去掉多余的array()嵌套层,让规则以平级键值对的形式声明:
use Illuminate\Support\Facades\Validator; // ... // 正确的规则结构:平铺键值对,无多余嵌套 $rules = [ 'prazos' => 'required|array', 'prazos.*' => ['nullable', 'date'] ]; $validator = Validator::make($request->all(), $rules); // 手动触发校验失败的异常,和$request->validate()行为对齐 if ($validator->fails()) { throw \Illuminate\Validation\ValidationException::withMessages( $validator->errors()->all() ); } // 校验通过后,这里拿到的prazos数据已经过滤掉所有非法值 $data = $validator->valid()['prazos']; foreach($data as $id => $prazo) { // 此处的$prazo只会是合法datetime字符串或者null }
按照你提供的测试参数场景,修正规则后验证器会自动识别索引为3的
jhbkjhg非法值,生成对应的字段校验错误,不会将该非法值返回给后续的业务逻辑。
内容的提问来源于stack exchange,提问作者MOzSalles
相关产品推荐
相关产品推荐

