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

Posted

技术标签:

【中文标题】如何在 laravel 验证中验证多个电子邮件?【英文标题】:How to validate multiple email in laravel validation? 【发布时间】:2015-06-09 21:04:38 【问题描述】:

我已经为 laravel 中的变量验证做了所有事情,但对于电子邮件我遇到了一个简单的问题。

来自 Laravel 的文档,

'email' => 'required|email'

我知道这仅适用于一个电子邮件地址,但用于类似,

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

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

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

但我仍然有错误。任何人都可以帮忙。

谢谢,

【问题讨论】:

【参考方案1】:

您需要编写自定义验证器,它将获取数组并手动验证数组中的每个电子邮件。在 Laravel 5 Request 中你可以做类似的事情

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'
    ];

【讨论】:

要扩展此答案,请记住在您的 validation.php 语言文件中添加自定义验证消息。 另外,the docs 建议将其放入 \App\Providers\AppServiceProvider::boot 从 Laravel 5.6 开始,您不需要这样做。看我的回答:***.com/a/53271104/255260【参考方案2】:

在 5.6 或更高版本中,您可以如下定义验证器规则:

'email.*' => 'required|email'

这将期望 email 键是有效电子邮件地址的数组。

【讨论】:

【参考方案3】:

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

protected function prepareForValidation() 

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

然后上面的函数会自动调用并将email-ids转换为数组,然后使用数组验证规则

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

【讨论】:

我喜欢这个解决方案,但我必须将 explode 调用包装在 array_filter 中,以避免传递带有空字符串的单值数组。此外,这给我显示验证消息带来了一些麻烦,因为它现在失败了,例如foobar.0 而不仅仅是 foobar 您可以使用公共函数 messages() 来格式化消息,例如 'foobar.*.required' => '电子邮件格式错误'。那么 foobar.0 就不会来了【参考方案4】:

Laravel 5.2 引入了数组验证,您可以轻松验证电子邮件数组:)

您所需要的只是将字符串分解为数组。

https://laravel.com/docs/5.2/validation#validating-arrays

【讨论】:

只有在有多个输入时才相关。【参考方案5】:

我是这样做的。工作对我有好处。 如果电子邮件或电子邮件(email1@gmail.com、email2@yahoo.com、email3@gmail.com)来自如下自定义验证器的表单。这需要添加到 - AppServiceProvider.php - 文件中。新规则是 - '电子邮件'。

    /**
     * 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',
    ]);

【讨论】:

以上是关于如何在 laravel 验证中验证多个电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中手动重新发送电子邮件验证?

如何在 Laravel 中验证电子邮件地址是不是是有效的 PayPal 电子邮件地址

如何在 laravel 中更新时验证电子邮件

如何在Laravel中手动重新发送电子邮件验证?

表单请求验证中的 Laravel“独特”自定义消息验证

Laravel 和 jwt-auth。如何检查用户电子邮件是不是经过验证