php 如何在laravel验证中验证多个电子邮件?

pobjuy32  于 2022-12-02  发布在  PHP
关注(0)|答案(6)|浏览(126)

我已经在laravel中完成了变量验证的所有工作,但对于电子邮件,我遇到了一个简单的问题。
从拉拉威尔的医生那里,

'email' => 'required|email'

我知道这只是一个邮箱地址,

email=abc@xyz.com,xyz@abc.com, def@ghi,com

当我发送电子邮件数组时,我仍然收到的电子邮件不是有效的电子邮件。我做了更多的像,

'email' => 'required|email|array'

但我还是出错了。有人能帮忙吗?
谢谢你,

suzh9iv8

suzh9iv81#

你需要编写自定义的Validator,它将接受数组并手动验证数组中的每一封邮件。

public function __construct() {
    Validator::extend("emails", function($attribute, $value, $parameters) {
        $rules = [
            'email' => 'required|email',
        ];
        foreach ($value as $email) {
            $data = [
                'email' => $email
            ];
            $validator = Validator::make($data, $rules);
            if ($validator->fails()) {
                return false;
            }
        }
        return true;
    });
}

public function rules() {
    return [
        'email' => 'required|emails'
    ];
}
v440hwme

v440hwme2#

我们可以在没有自定义验证的情况下实现这一点,我们可以覆盖一个方法prepareForValidation

protected function prepareForValidation() 
{
   //Here email we are reciving as comma seperated so we make it array
   $this->merge(['email' => explode(',', rtrim($this->email, ','))]);
}

然后自动调用上述函数,并将电子邮件ID转换为数组,之后使用数组验证规则

public function rules()
 {
     return [
        'email.*' => 'required|email'
     ];
 }
nfzehxib

nfzehxib3#

在5.6或更高版本中,您可以按如下方式定义验证器规则:
'email.*' => 'required|email'
这将要求email键是有效电子邮件地址的数组。

okxuctiv

okxuctiv4#

Laravel 5.2引入了阵列验证,您可以轻松地验证电子邮件阵列:)
您所需要的只是将字符串分解为数组。
https://laravel.com/docs/5.2/validation#validating-arrays

ee7vknir

ee7vknir5#

我是这样做的。对我来说很好。如果一封或多封电子邮件(email1@gmail.com,email2@yahoo.com,email3@gmail.com)来自这样的表单,下面的自定义验证器就可以工作。这需要添加到- AppServiceProvider.php -文件中。新规则是- 'emails'。

/**
     * emails
     * Note: this validates multiple emails in coma separated string.
     */
    Validator::extend('emails', function ($attribute, $value, $parameters, $validator) {
        $emails = explode(",", $value);
        foreach ($emails as $k => $v) {
            if (isset($v) && $v !== "") {
                $temp_email = trim($v);
                if (!filter_var($temp_email, FILTER_VALIDATE_EMAIL)) {
                    return false;
                }
            }
        }
        return true;
    }, 'Error message - email is not in right format');

而在你的控制器中,它可以这样使用:

$this->validate($request, [
        'email_txt_area' => 'emails',
    ]);
ngynwnxp

ngynwnxp6#

如果你不想仅仅因为一个规则就覆盖prepareForValidation,这里有另一种使用闭包的方法:

$rules = [
    'name'  => 'required|string|max:255',
    'email' => [
        'required',
        function ($attribute, $value, $fail) {
            $emails = array_map('trim', explode(',', $value));
            $validator = Validator::make(['emails' => $emails], ['emails.*' => 'required|email']);
            if ($validator->fails()) {
                $fail('All email addresses must be valid.');
            }
        },
    ],
];

使用Laravel 9.x进行测试

相关问题