Laravel 8.5x验证器如何让字符串0通过nullable日期字段校验
问题原因
Laravel 中的 nullable 验证规则仅对 null、空字符串、空数组这类标准空值生效,会跳过后续的验证逻辑。你场景中出现的字符串 "0" 不属于规则定义的空值范围,因此验证器会继续执行后续的日期正则校验,自然无法匹配格式要求导致校验失败。
解决方案
这里提供两种常用的修改方式,都可以满足需求:
方案1:修改正则直接兼容"0"
不需要调整验证规则结构,仅需在原有日期正则中新增对"0"的匹配逻辑即可,改动量最小:
use Illuminate\Support\Facades\Validator; $validator = Validator::make( [ 'SelectedMonth' => $SelectedMonth, 'SelectedStartDate' => $SelectedStartDate, 'SelectedEndDate' => $SelectedEndDate ], [ 'SelectedMonth' => 'required|max:7|regex:/^(\d{4}-)?\d{2}$/', 'SelectedStartDate' => 'nullable|max:12|regex:/^0$|^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/', 'SelectedEndDate' => 'nullable|max:12|regex:/^0$|^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/' ] ); if ($validator->fails()) { abort(404); }
注:原有代码中
SelectedMonth的正则规则漏写了正则分隔符,上面代码已经统一修正为和其他字段一致的/分隔符,避免不同环境下解析出错。
方案2:使用闭包做条件验证
如果后续还要新增其他校验逻辑,用闭包做条件判断扩展性更强,仅当字段值不等于"0"时才执行日期格式校验:
use Illuminate\Support\Facades\Validator; $validator = Validator::make( [ 'SelectedMonth' => $SelectedMonth, 'SelectedStartDate' => $SelectedStartDate, 'SelectedEndDate' => $SelectedEndDate ], [ 'SelectedMonth' => 'required|max:7|regex:/^(\d{4}-)?\d{2}$/', 'SelectedStartDate' => [ 'nullable', 'max:12', function ($attribute, $value, $fail) { // 值为0时直接跳过校验 if ($value === "0") return; if (!preg_match('/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/', $value)) { $fail($attribute.'格式不符合要求'); } } ], 'SelectedEndDate' => [ 'nullable', 'max:12', function ($attribute, $value, $fail) { if ($value === "0") return; if (!preg_match('/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/', $value)) { $fail($attribute.'格式不符合要求'); } } ] ] ); if ($validator->fails()) { abort(404); }
内容的提问来源于stack exchange,提问作者Domen
相关产品推荐
相关产品推荐

