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

Laravel 5.4中邮箱/手机号二选一验证实现方法问询

在Laravel 5.4中实现邮箱/手机号二选一验证

嘿,这个需求我做OTP接口的时候刚好碰到过,Laravel的Validator完全能搞定这个场景,给你两种实用的方案,看哪种更贴合你的代码风格:

方案一:闭包验证(快速落地)

这种方式不用额外注册规则,直接在验证逻辑里写判断,适合只在这个接口用的场景。你只需要修改validator方法,给verify_by字段加个自定义闭包规则就行:

protected function validator(array $data) {
    return Validator::make($data, [
        'verify_by' => [
            'required',
            function ($attribute, $value, $fail) {
                // 验证邮箱格式
                $isValidEmail = filter_var($value, FILTER_VALIDATE_EMAIL);
                // 验证手机号格式(这里是国内11位手机号正则,可根据需求调整)
                $isValidPhone = preg_match('/^1[3-9]\d{9}$/', $value);

                if (!$isValidEmail && !$isValidPhone) {
                    $fail('The ' . $attribute . ' must be a valid email address or phone number.');
                }
            },
        ],
    ]);
}

方案二:自定义验证规则(适合复用)

如果项目里多个地方都需要这种“邮箱或手机号”的验证,自定义规则会更优雅,代码也更整洁:

  1. 先在AppServiceProvider的boot方法里注册规则:
use Illuminate\Support\Facades\Validator;

public function boot()
{
    Validator::extend('email_or_phone', function ($attribute, $value, $parameters, $validator) {
        $isValidEmail = filter_var($value, FILTER_VALIDATE_EMAIL);
        $isValidPhone = preg_match('/^1[3-9]\d{9}$/', $value);
        return $isValidEmail || $isValidPhone;
    });

    // 自定义错误提示语
    Validator::replacer('email_or_phone', function ($message, $attribute, $parameters, $validator) {
        return str_replace(':attribute', $attribute, 'The :attribute must be a valid email address or phone number.');
    });
}
  1. 然后在validator方法里直接用这个规则:
protected function validator(array $data) {
    return Validator::make($data, [
        'verify_by' => 'required|email_or_phone',
    ]);
}

小提醒

  • 手机号正则:上面的正则是针对国内手机号的,如果要支持国际号码,记得调整正则表达式哦。
  • 错误提示:两种方案都可以自定义提示内容,让返回的错误信息更贴合你的业务场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:47