我已经完成了laravel中变量的所有验证工作,但对于电子邮件,我遇到了一个简单的问题。
来自Laravel博士,
'email' => 'required|email'
我知道这只是一个电子邮件地址,但对于
email=abc@xyz.com,xyz@abc.com, def@ghi,com
当我发送一系列电子邮件时,我仍然收到一封无效的电子邮件。我做了更多类似的事情
'email' => 'required|email|array'
但我还是犯了错误。任何身体都能帮上忙吗。
谢谢,
您需要编写自定义Validator,它将获取数组并手动验证数组中的每个电子邮件。在Laravel 5请求中,你可以做一些类似的事情
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'
];
}
在5.6或更高版本中,您可以如下定义验证器规则:
'email.*' => 'required|email'
这将要求email
密钥是一组有效的电子邮件地址。
我们可以在没有自定义验证的情况下实现这一点,我们可以重写方法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'
];
}
Laravel 5.2引入了数组验证,您可以轻松验证电子邮件数组:)
您所需要的只是将字符串分解为数组。
https://laravel.com/docs/5.2/validation#validating-阵列
我是这样做的。工作对我有好处。如果电子邮件(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',
]);
如果你不想仅仅因为一条规则而覆盖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 测试