Laravel/メールアドレスのバリデーション例(セミコロン区切りで複数の場合)
Laravelメールアドレスのバリデーション例(セミコロン区切りで複数の場合)
app/Rules/ValidEmailList.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class ValidEmailList implements Rule
{
protected $invalidEmail = null;
public function passes($attribute, $value)
{
$emails = array_map('trim', explode(';', $value));
$this->invalidEmail = null;
// 区切り文字のみ
if(preg_match("/^;+$/", str_replace(" ", "", $value))) {
return false;
}
// ブランクなら許可
if(implode("", $emails) === "") {
return true;
}
foreach ($emails as $email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->invalidEmail = $email;
return false;
}
}
return true;
}
public function message()
{
$targetEmailAddress = $this->invalidEmail;
if($this->invalidEmail == "" || is_null($this->invalidEmail)) {
$targetEmailAddress = "(empty)";
}
return "Mail address format is invalid: {$targetEmailAddress}";
}
}
app/Rules/UniqueEmailList.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class UniqueEmailList implements Rule
{
protected $duplicateEmail = null;
public function passes($attribute, $value)
{
$emails = array_map('trim', explode(';', $value));
$normalized = array_map('strtolower', $emails);
$duplicates = array_diff_key($normalized, array_unique($normalized));
if (!empty($duplicates)) {
$this->duplicateEmail = $emails[array_keys($duplicates)[0]];
return false;
}
return true;
}
public function message()
{
$targetEmailAddress = $this->duplicateEmail;
if($this->duplicateEmail == "" || is_null($this->duplicateEmail)) {
$targetEmailAddress = "(empty)";
}
return "There are duplicate email addresses: {$targetEmailAddress}";
}
}
実際のルールの適用方法
use App\Rules\ValidEmailList;
use App\Rules\UniqueEmailList;
...コントローラ...
$rules = [
'email' => [new ValidEmailList(), new UniqueEmailList(), その他のルール],
];
$this->validate($request, $rules);
Laravel/メールアドレスのバリデーション例(セミコロン区切りで複数の場合).md