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.'); } }, ], ]); }
方案二:自定义验证规则(适合复用)
如果项目里多个地方都需要这种“邮箱或手机号”的验证,自定义规则会更优雅,代码也更整洁:
- 先在
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.'); }); }
- 然后在
validator方法里直接用这个规则:
protected function validator(array $data) { return Validator::make($data, [ 'verify_by' => 'required|email_or_phone', ]); }
小提醒
- 手机号正则:上面的正则是针对国内手机号的,如果要支持国际号码,记得调整正则表达式哦。
- 错误提示:两种方案都可以自定义提示内容,让返回的错误信息更贴合你的业务场景。
内容的提问来源于stack exchange,提问作者Kanu Patel
相关产品推荐
相关产品推荐

