我正在使用最新版本的Laravel。
我在商店控制器中使用Validator,并且本质上我有一个名为“ current”的字段,该字段是必需的,并且应该是布尔值。我还有一个第二个字段,它是可选的,称为“ to_date”,JavaScript插件(moment.js)将为该字段提供一个日期,或者如果为null,则为控制器提供一个字符串“ Invalid date”。
如果“当前”等于0,我希望能够使用Validator将“ to_date”验证为日期。如果“当前”等于1,那么我希望忽略对“ to_date”字段的验证
我的代码开始为:
$validator = Validator::make($request->all(), [
'current' => 'required|boolean',
'to_date' => 'date',
]);
但是这当然失败了,因为没有提供“ to_date”时,前端会提供一个字符串“ Invalid date”,该字符串将使验证失败。然后,我进一步研究了Laravel的验证规则,并发现了似乎合适的'exclude_if'。
$validator = Validator::make($request->all(), [
'current' => 'required|boolean',
'to_date' => 'exclude_if:current,1|date',
]);
这仍然没有用,因为虽然它似乎从$ validator数组中“排除了它”,但它仍然转到“日期”验证并失败。因此,然后我查看了“保释金”,当Validator首次失败时,该保释金应该终止验证,但是,这也不起作用,因为exclude_if在运行时不会失败,并且脚本仍然达到“ date”并且失败。
任何帮助/指针都表示赞赏。
我敢肯定,可以通过将Validator包裹在if语句中并做一些逻辑检查是否在Validator中包括“ to_date”来解决此问题,但这似乎有点臭,而且不太整齐。
有什么想法吗? :)
答案 0 :(得分:0)
问题是您有意提供错误的数据“无效日期”。
这将触发验证失败,因为存在数据。
exclude_if
仅在验证后从数组中排除数据。
最好的解决方案是不发送错误数据,而执行required_if:current,0|date
,并且当to_date
为空且必填时,它将使日期验证部分失败。
答案 1 :(得分:0)
经Laravel 6.18.7测试,您的代码对我而言正常工作。如果仍然有问题,则可能需要检查您的输入。
我在修补程序中使用的示例代码:
>>> Validator::make([
'current' => 1,
'to_date' => 'invalid-data',
], [
'current' => 'required|boolean',
'to_date' => 'exclude_if:current,1|date',
])->passes();
=> true