symfony/messenger
Symfony Messenger helps PHP apps send and receive messages via async transports and message queues. Dispatch commands/events, route to handlers, and integrate with workers and transports to decouple services and improve scalability.
symfony/messenger package excels in Laravel applications requiring asynchronous processing, event-driven workflows, or microservices communication. It aligns with Laravel’s queue system (Laravel Queues) but offers more flexibility (e.g., multi-transport routing, retries, middleware, and failure handling).symfony/messenger + laravel-horizon or custom workers) or replace it for advanced use cases (e.g., distributed task orchestration).MessengerBundle) or as a composer package in Laravel.symfony/messenger via a custom queue connector (e.g., Illuminate\Bus\QueueingDispatcher → Symfony\Messenger\MessageBus).symfony/messenger workers with minor configuration (e.g., custom worker classes).| Risk Area | Mitigation Strategy |
|---|---|
| Learning Curve | Requires understanding of Symfony’s message buses, transports, and stamps. Mitigate via documentation and Laravel-specific wrappers. |
| Migration Complexity | Replacing Laravel Queues requires rewriting job classes to Message classes and configuring transports. Start with parallel integration (dual queues). |
| Transport Lock-in | Avoid vendor-specific features (e.g., SQS DLQ). Use generic stamps (e.g., RetryStamp) for portability. |
| Error Handling | Failure transport must be monitored (e.g., via Horizon or custom scripts). Use dead-letter queues (DLQ) for debugging. |
| PHP Version | Requires PHP 8.1+ (Symfony 6.4+) or 8.4+ (Symfony 8.0). Ensure Laravel version compatibility. |
symfony/messenger over Laravel Queues?
Illuminate\Bus\QueueingDispatcher with Symfony\Component\Messenger\MessageBus.symfony/messenger as a drop-in replacement for Laravel Queues via a facade or service provider.Symfony\Component\Messenger\Worker for custom workers (e.g., php artisan messenger:consume async --time-limit=300).class SendEmail implements Message).RetryStamp, DelayStamp).symfony/messenger:redis-transport (compatible with Laravel Redis).symfony/messenger:amqp-transport (RabbitMQ).symfony/messenger (temporary).// Laravel Job
dispatch(new SendEmailJob($user));
// Symfony Message (parallel)
$bus->dispatch(new SendEmailMessage($user->email));
symfony/messenger.Symfony\Component\Messenger\Worker.Illuminate\Queue\QueueManager with a custom queue connector for symfony/messenger.| Component | Compatibility Notes |
|---|---|
| Laravel Queues | Can coexist but requires custom queue connectors. |
| Horizon | Supports symfony/messenger workers with custom worker classes. |
| Laravel Events | Use symfony/messenger for async events (e.g., EventDispatcher → MessageBus). |
| Database | Doctrine transport needs schema migrations (use Laravel Migrations). |
| Redis | Works with Laravel Redis config (no changes needed). |
config/packages/messenger.yaml (Symfony) or config/messenger.php (Laravel).framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%' # e.g., redis://localhost
failure: 'doctrine://default?queue_name=failure'
routing:
'App\Message\SendEmail': async
Message classes (e.g., SendEmailMessage).RetryStamp, DelayStamp).Worker.$this->commands([
new ConsumeMessagesCommand($bus, $transport, $receiver),
]);
MessageBus into services/controllers.$bus->dispatch(new SendEmailMessage($user->email));
messenger.yaml/messenger.php setup.messenger:consume, messenger:failed).Monolog with Symfony’s MessengerLogger or custom logging middleware.messenger:stats and adjust worker concurrency.How can I help you explore Laravel packages today?