How to validate multiple email in laravel validation?

17,914

Solution 1

You need to write custom Validator, which will take the array and validate each ofthe emails in array manually. In Laravel 5 Request you can do something like that

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

Solution 2

In 5.6 or above you can define your validator rule as follows:

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

This will expect the email key to be an array of valid email addresses.

Solution 3

We can achieve this without custom validation,We can overridden a method prepareForValidation

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

Then above function will call automatically and convert email-ids to array, after that use array validation rule

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

Solution 4

Laravel 5.2 introduced array validation and you can easily validate array of emails :)

All you need is exploding the string to array.

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

Solution 5

I did it like this. Working good for me. if email or emails ([email protected], [email protected], [email protected]) are coming from a Form like this following custom validator works. This need to be added to - AppServiceProvider.php - file. And new rule is - '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');

And in your controller, it can be used like this:

    $this->validate($request, [
        'email_txt_area' => 'emails',
    ]);
Share:
17,914

Related videos on Youtube

Subhod30
Author by

Subhod30

Updated on June 04, 2022

Comments

  • Subhod30
    Subhod30 almost 2 years

    I have done all the things for the validation for the variable in laravel but for emails I got one simple problem.

    From doc of Laravel,

    'email' => 'required|email'
    

    I got to know this is for only one email address but for like,

    [email protected],[email protected], def@ghi,com
    

    When I send array of the email i still get email is not a valid email. I have done more like,

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

    But I still got error. can any body help.

    Thanks,

  • chifliiiii
    chifliiiii over 7 years
    To extend this answer, remember to add the custom validation message on your validation.php language file.
  • mpen
    mpen over 6 years
    Also, the docs suggest putting this in \App\Providers\AppServiceProvider::boot
  • jezmck
    jezmck almost 6 years
    Only relevant if there are multiple inputs.
  • Julian
    Julian over 5 years
    As of Laravel 5.6 you don't need to do this. See my answer: stackoverflow.com/a/53271104/255260
  • Illya Moskvin
    Illya Moskvin over 4 years
    I like this solution, but I had to wrap the explode call in array_filter to avoid passing a single-value array with an empty string. Also, this is giving me some trouble with displaying validation messages, since it's now failing on e.g. foobar.0 instead of just foobar.
  • Elby
    Elby over 4 years
    You can use public function messages() for format messages like 'foobar.*.required' => 'email format is wrong'. Then foobar.0 will not come