Laravel 5.7使用required_if实现邮箱手机号至少填一项不生效问题
问题根因
- 规则顺序和逻辑冲突:
nullable规则的执行优先级更高,当字段为空时会直接跳过该字段后续的所有验证规则,因此两个字段同时留空时,你写的required_if规则根本不会触发校验。 - 规则选型错误:
required_if适用于「另一个字段等于指定值时当前字段必填」的场景,不符合你需要的「两个字段至少填一个」的校验逻辑,Laravel内置的required_without规则才是对应场景的正确选型。
修复方案
将验证规则调整为如下写法即可,注意要把required_without放在nullable前面,优先执行必填校验:
'firstName' => 'nullable', 'lastName' => 'nullable', 'email' => ['required_without:phone', 'nullable', 'email'], 'phone' => ['required_without:email', 'nullable'],
可选:自定义错误提示
默认的错误提示会分别提示邮箱/手机号必填,如果你想要更贴合业务的统一提示,可以在验证时传入自定义消息数组:
$rules = [ // 上述验证规则 ]; $messages = [ 'email.required_without' => '邮箱和手机号至少填写一项', 'phone.required_without' => '邮箱和手机号至少填写一项', ]; $validated = $request->validate($rules, $messages);
内容的提问来源于stack exchange,提问作者OnlyProblems
相关产品推荐
相关产品推荐

