black/email
PHP 5.4+ value object for safer email handling. Validates email format (throws on invalid), exposes recipient/domain/tld getters, array parsing, and equality checks. Note: relies on FILTER_VALIDATE_EMAIL; limited for non-ASCII and provider rules.
Illuminate\Support\Facades\Validator or Illuminate\Validation by providing a type-safe, reusable email abstraction layer. Useful for:
StoreUserRequest).UserRegistrationService).CreateUserRequest in Laravel Sanctum/Passport).Rule::email()) for stricter type safety or custom business rules (e.g., "only allow corporate domains").Mail::send() + Mailgun/SendGrid webhooks for bounce handling.egulias/email-validator) for DNS checks if needed.user@sub.domain.co.uk, user+tag@domain.com).EmailEmail is non-idiomatic (likely a typo; should be Email). Risk:
App\ValueObjects\Email) to avoid confusion.Rule::email() with new Email\Email($request->email) in App\Http\Requests\StoreUserRequest.User::getEmail(): Email).type: string, format: email → type: Email).Rule::email() with Email\Email in form requests.public function rules(): array
{
return [
'email' => ['required', function ($attribute, $value, $fail) {
try {
new Email\Email($value);
} catch (InvalidEmailEmailException) {
$fail('The '.$attribute.' must be a valid email address.');
}
}],
];
}
User model) with Email.class User {
private Email $email;
// ...
}
Email type hints.public function toArray($request): array
{
return [
'email' => $this->email->getValue(),
];
}
Email as a scalar type in PHP 8.0+).new Email("test@example.com") vs. Email::fromString()).Email in Mailable constructors for type safety.notifiable()->notify(new InvoicePaid($user->email)) with new InvoicePaid($user->email->getValue()).| Priority | Task | Dependencies |
|---|---|---|
| P0 | Replace Rule::email() in critical form requests |
None |
| P1 | Update domain models to use Email type |
P0 |
| P2 | Integrate into API responses/contracts | P1 |
| P3 | Add DNS validation layer (if needed) | External package (e.g., egulias/email-validator) |
Email methods (e.g., getValue(), getDomain()).InvalidEmailEmailException) simplify error handling.try {
$email = new Email\Email($input);
} catch (InvalidEmailEmailException $e) {
return back()->withErrors(['email' => 'Invalid format.']);
}
docs/laravel-integration.md for team onboarding.Illuminate\Support\Facades\Cache).Email in event payloads (e.g., UserRegistered event) for consistency.| Scenario | Impact | Mitigation |
|---|---|---|
| Invalid Email Submitted | User registration fails | Use try-catch in form requests. |
| Package Deprecation | Broken builds | Fork or migrate to symfony/validator + custom constraints. |
| DNS Validation Missing | Bounced emails | Implement webhook handlers (e.g., Mailgun) or add egulias/email-validator. |
| PHP Version Incompatibility | Build failures | Pin version in composer.json (e.g., "black/email": "1.0.0"). |
User model and StoreUserRequest.Email integration.Email in a Mailable").phpstan rules to enforce Email usage in domain models.Email is used incorrectly (e.g., new Email(null)).How can I help you explore Laravel packages today?