40 lines
995 B
PHP
40 lines
995 B
PHP
<?php
|
|
|
|
namespace App\Shared\ValueObject;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
final readonly class EmailAddress
|
|
{
|
|
private const string ERROR_MESSAGE = 'Invalid email address:';
|
|
|
|
private string $normalized;
|
|
|
|
public function __construct(string $email)
|
|
{
|
|
$trimmedEmail = trim($email);
|
|
if (
|
|
$trimmedEmail === ''
|
|
|| ! str_contains($trimmedEmail, '@')
|
|
) {
|
|
throw new InvalidArgumentException(
|
|
self::ERROR_MESSAGE." $email",
|
|
);
|
|
}
|
|
|
|
[$localPart, $domain] = explode('@', $trimmedEmail, 2);
|
|
$normalizedEmail = $localPart.'@'.mb_strtolower($domain);
|
|
if (filter_var($normalizedEmail, FILTER_VALIDATE_EMAIL) === false) {
|
|
throw new InvalidArgumentException(
|
|
self::ERROR_MESSAGE." $email",
|
|
);
|
|
}
|
|
|
|
$this->normalized = $normalizedEmail;
|
|
}
|
|
|
|
public function value(): string
|
|
{
|
|
return $this->normalized;
|
|
}
|
|
}
|