bengor-user/swift-mailer-bridge
SwiftMailerBridge provides an adapter to make BenGorUser User objects compatible with SwiftMailer, enabling seamless use of your user domain model when addressing and sending emails via SwiftMailer in PHP applications.
Installation:
composer require bengor-user/swift-mailer-bridge
Ensure your project uses BenGorUser/User (v0.8) and SwiftMailer (v5.x or v6.x).
Basic Setup:
config/app.php:
'providers' => [
// ...
BenGorUser\SwiftMailerBridge\SwiftMailerBridgeServiceProvider::class,
],
config/mail.php:
'bridge' => [
'user_class' => BenGorUser\User\User::class,
],
First Use Case: Send a password reset email using SwiftMailer with a BenGorUser:
use BenGorUser\SwiftMailerBridge\UserMessage;
use Swift_Mailer;
$mailer = new Swift_Mailer(/* your transport */);
$user = $this->userRepository->find(1); // BenGorUser instance
$message = (new UserMessage())
->setUser($user)
->setSubject('Reset Password')
->setBodyFromView('emails.reset_password', ['user' => $user]);
$mailer->send($message);
Laravel Integration: Use the bridge in a Mailable class:
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use BenGorUser\SwiftMailerBridge\UserMessage;
class ResetPasswordMailable extends Mailable
{
use Queueable;
public function build()
{
$user = auth()->user();
$message = (new UserMessage())
->setUser($user)
->setSubject('Reset Password')
->setBodyFromView('emails.reset_password');
return $this->markdown('emails.reset_password')
->with(['user' => $user])
->to($user->getEmail());
}
}
Event-Driven Emails:
Attach the bridge to Laravel events (e.g., Registered, PasswordReset) to automate emails:
// In EventServiceProvider
protected $listen = [
\Illuminate\Auth\Events\Registered::class => [
\App\Listeners\SendWelcomeEmail::class,
],
];
// Listener
public function handle(Registered $event)
{
$mailer = app(Swift_Mailer::class);
$message = (new UserMessage())
->setUser($event->user)
->setSubject('Welcome!')
->setBodyFromView('emails.welcome');
$mailer->send($message);
}
Dynamic Email Templates: Use Blade templates with user data:
// In a Mailable
$message = (new UserMessage())
->setUser($user)
->setBodyFromView('emails.notification', [
'user' => $user,
'activity' => $activity,
]);
<!-- resources/views/emails/notification.blade.php -->
<p>Hello {{ $user->getName() }},</p>
<p>You have new activity: {{ $activity->description }}</p>
Multi-Recipient Emails: Send emails to multiple users with shared context:
$message = (new UserMessage())
->setSubject('Team Update')
->setBodyFromView('emails.team_update');
foreach ($teamMembers as $user) {
$message->setUser($user);
$mailer->send($message);
}
Queueing Emails: Dispatch emails as jobs for async processing:
use Illuminate\Support\Facades\Bus;
Bus::dispatch(new SendEmailJob($user, 'welcome'));
// SendEmailJob.php
public function handle()
{
$mailer = app(Swift_Mailer::class);
$message = (new UserMessage())
->setUser($this->user)
->setSubject($this->subject)
->setBodyFromView('emails.' . $this->subject);
$mailer->send($message);
}
Password Reset Flow:
PasswordReset event.$message = (new UserMessage())
->setUser($user)
->setSubject('Reset Password')
->setBodyFromView('emails.reset', [
'token' => $token,
'expires' => now()->addHours(1),
]);
User Verification:
$message = (new UserMessage())
->setUser($user)
->setSubject('Verify Your Email')
->setBodyFromView('emails.verify', [
'verificationUrl' => route('verification.verify', ['token' => $token]),
]);
Transactional Emails:
$message = (new UserMessage())
->setUser($user)
->setSubject('Order #{{ $order->id }} Confirmed')
->setBodyFromView('emails.order_confirmation', [
'order' => $order,
]);
Leverage Laravel’s Mail Facade:
Combine the bridge with Laravel’s Mail facade for consistency:
use Illuminate\Support\Facades\Mail;
use BenGorUser\SwiftMailerBridge\UserMessage;
$message = (new UserMessage())
->setUser($user)
->setSubject('Hello!');
Mail::send($message);
Customize SwiftMailer Transport:
Configure SwiftMailer in config/mail.php:
'swift' => [
'transport' => 'smtp',
'host' => env('MAIL_HOST', 'smtp.example.com'),
'port' => env('MAIL_PORT', 587),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
],
Extend UserMessage:
Add custom methods to UserMessage for project-specific needs:
class CustomUserMessage extends UserMessage
{
public function addOrderDetails($order)
{
$this->body .= "\nOrder #{$order->id}: {$order->total}";
return $this;
}
}
Testing:
Use Laravel’s MailFake for unit tests:
public function test_welcome_email()
{
Mail::fake();
$user = factory(BenGorUser\User\User::class)->create();
$message = (new UserMessage())
->setUser($user)
->setSubject('Welcome');
Mail::send($message);
Mail::assertSent(UserMessage::class, function ($mail) use ($user) {
return $mail->getSubject() === 'Welcome' &&
$mail->getTo()[0] === $user->getEmail();
});
}
PHP Version Mismatch:
SwiftMailer Version Conflicts:
composer.json:
"require": {
"swiftmailer/swiftmailer": "^6.0"
}
Tight Coupling to BenGorUser:
BenGorUser\User instance. If using Laravel’s App\User, you’ll need to:
BenGorUser\User to match your model.interface UserContract {
public function getEmail();
public function getName();
// Add other required methods.
}
Then wrap your Laravel user:
class LaravelUserAdapter implements UserContract {
protected $user;
public function __construct($user) {
$this->user = $user;
}
public function getEmail() {
return $this->user->email;
}
// Implement other methods.
}
Missing Laravel-Specific Features:
How can I help you explore Laravel packages today?