You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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位之间',
];

最终验证效果完全匹配你的需求

  1. 两个字段都为空:触发「至少填写一项」的提示,符合必填要求。
  2. 仅填写邮箱:仅校验邮箱格式正确性,手机号不会触发任何校验。
  3. 仅填写手机号:仅校验手机号格式正确性,邮箱不会触发任何校验。
  4. 两个字段都填写:同时校验两个字段的格式,全部符合要求才会通过验证。

内容的提问来源于stack exchange,提问作者Elias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:09:05