Laravel使用required_without实现邮箱手机号二选一必填及格式验证问题
问题原因
你原有规则未生效的核心问题是缺少nullable规则:当其中一个字段传了空值、另一个字段已正常填写时,空字段依然会触发后续的格式校验逻辑,不符合「仅校验已填写字段格式」的需求。另外当两个字段都为空时,会同时返回两个必填错误,可通过自定义消息优化体验。
修改后的验证规则
public static array $createValidationRules = [ 'email' => 'required_without:telephone|nullable|email:rfc', 'telephone' => 'required_without:email|nullable|digits_between:5,15', ];
修改说明
- 新增
nullable规则:如果字段值为空(Laravel默认会把空字符串转为null),会跳过后续的格式校验,避免另一个字段已填写时,空字段误报格式错误。 - 将原有的
numeric|regex:/^\d{5,15}$/替换为内置的digits_between:5,15规则,效果完全一致,可读性更高,也避免正则规则的优先级问题。
可选:自定义错误消息优化
如果要避免两个字段都为空时同时返回两个必填提示,可以配套自定义验证消息:
public static array $createValidationMessages = [ 'email.required_without' => '邮箱和手机号至少填写一项', 'telephone.required_without' => '邮箱和手机号至少填写一项', 'email.email' => '请填写符合规范的邮箱地址', 'telephone.digits_between' => '手机号长度需在5-15位之间', ];
最终验证效果完全匹配你的需求
- 两个字段都为空:触发「至少填写一项」的提示,符合必填要求。
- 仅填写邮箱:仅校验邮箱格式正确性,手机号不会触发任何校验。
- 仅填写手机号:仅校验手机号格式正确性,邮箱不会触发任何校验。
- 两个字段都填写:同时校验两个字段的格式,全部符合要求才会通过验证。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

