Laravel:电子邮件验证

3

我不知道如何为电子邮件字段制定验证规则。

我希望在有人注册时,只接受非服务器邮箱,例如'@myemail.com,@yahoo.com,@outlook.com'。如果输入此类邮件地址,将显示“您的电子邮件地址无效”。我应该怎么做?

请帮帮我,这是我的ResigterController.php文件。

protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
        'mobile_no' => ['required', 'string', 'min:10'],
        'company' => ['required', 'string', 'max:255'],
        'username' => ['required', 'string', 'max:255', 'unique:users'],

    ]);
}

controller.php

config.php

我在配置文件目录中找不到email.php。


4
请将您的代码以文本形式发布,而不是作为图片。 - MrEvers
你有一个mail.php文件。http://prntscr.com/q0mvf4 - Earid
是的,我有。请给我一个例子。还有,我正在使用 Laravel 6。 - Alok Mishra
1
mail.php文件与验证规则无关。 - IGP
3个回答

1
'email' => 'required|email|max:255|unique:users',

这段代码与问题中的代码完全相同,只是格式不同。问题在于确保某些域名的电子邮件未通过验证,而这段代码并没有做到这一点。 - Laurel

1
你可以在此基础上添加一个正则表达式验证。
$rules = [
    'name' => ['required', 'string', 'max:255'],
    'email' => [
        'required',
        'string',
        'email',
        'max:255',
        'unique:users',
        'regex:/^\w+[-\.\w]*@(?!(?:outlook|myemail|yahoo)\.com$)\w+[-\.\w]*?\.\w{2,4}$/'
    ],
    'password' => ['required', 'string', 'min:8', 'confirmed'],
    'mobile_no' => ['required', 'string', 'min:10'],
    'company' => ['required', 'string', 'max:255'],
    'username' => ['required', 'string', 'max:255', 'unique:users'],
];
// Add a custom message for regex validation on email field.
$messages = [
    'email.regex' => 'We do not accept mails with this domain.'
];

Validator::make($data, $rules, $messages);

我从回复另一个问题中改编了正则表达式。 根据regex101.com,正则表达式应该有效。
另一个选项是创建自己的验证规则。 可以参考文档

\w{2,4} 用于顶级域名是错误的,它接受 1_b 但不接受 museum。请查看以下网站:TLD列表有效/无效地址RFC822电子邮件地址的正则表达式 - Toto
@Toto 但它正在工作,抱歉,我没听懂你的意思。 - Alok Mishra
@Toto 完全透露:我不知道这为什么有效,也不知道为什么会有效。我只是从另一个答案中调整了一个正则表达式,碰巧做到了 OP 所要求的。 - IGP

0
最好使用分离的配置文件,例如config\settings.php。
<?php
    return [
      'restricted_email_domains'=>[
         'myemail.com', 'yahoo.com', 'outlook.com',
      ],
    ];

所以,你的代码应该是这样的

protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users',
                function ($attribute, $value, $fail) {
                   if (in_array($value, config('settings.restricted_email_domains')))
                   {
                       $fail('The '.$attribute.' is invalid.');
                   }
                },
            ],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
        'mobile_no' => ['required', 'string', 'min:10'],
        'company' => ['required', 'string', 'max:255'],
        'username' => ['required', 'string', 'max:255', 'unique:users'],

    ]);
}

参考使用闭包


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接