How to validate multiple email in laravel validation?
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',
]);
Related videos on Youtube
Subhod30
Updated on June 04, 2022Comments
-
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 over 7 yearsTo extend this answer, remember to add the custom validation message on your validation.php language file.
-
mpen over 6 yearsAlso, the docs suggest putting this in
\App\Providers\AppServiceProvider::boot
-
jezmck almost 6 yearsOnly relevant if there are multiple inputs.
-
Julian over 5 yearsAs of Laravel 5.6 you don't need to do this. See my answer: stackoverflow.com/a/53271104/255260
-
Illya Moskvin over 4 yearsI like this solution, but I had to wrap the
explode
call inarray_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 justfoobar
. -
Elby over 4 yearsYou can use public function messages() for format messages like 'foobar.*.required' => 'email format is wrong'. Then foobar.0 will not come