Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Messenger Laravel Package

draw/messenger

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require draw/messenger
    

    Ensure doctrine/doctrine-bundle and symfony/messenger are also installed.

  2. Configuration Add the transport to config/packages/symfony_messenger.yaml:

    transports:
        messenger_db:
            dsn: 'doctrine://default'
            options:
                table_name: 'message'
                queue_name: 'default'
                lock_lifetime: 3600
                retry_strategy:
                    max_retries: 3
                    delay: 1000
    
  3. First Use Case Send a test message:

    use Symfony\Component\Messenger\MessageBusInterface;
    use App\Messages\TestMessage;
    
    $bus->dispatch(new TestMessage('Hello, Messenger!'));
    

    Verify the message in the message table (or your custom table).


Implementation Patterns

Workflow Integration

  1. Message Handling Use a worker to process messages:

    use Symfony\Component\Messenger\Worker;
    
    $worker = new Worker([$bus, $router], $transport);
    $worker->run();
    

    Run via CLI:

    php bin/console messenger:consume messenger_db -vv
    
  2. Custom Table Setup Extend the transport for custom tables:

    options:
        table_name: 'custom_messages'
    

    Ensure the table exists (migrate via Doctrine).

  3. Retry Strategies Configure retries in config/messenger.yaml:

    retry_strategy:
        max_retries: 5
        delay: 2000
        multiplier: 2
    
  4. Async Dispatching Use AsyncBus for background processing:

    $asyncBus = $container->get('messenger.bus.async');
    $asyncBus->dispatch(new TestMessage('Async Task'));
    

Gotchas and Tips

Pitfalls

  1. Locking Issues

    • If messages fail to process, check lock_expired and failed_at columns.
    • Ensure lock_lifetime is sufficient for long-running tasks.
  2. Table Schema

    • The package assumes a default schema. Customize via table_name or extend the transport class:
      use Draw\Messenger\Transport\DoctrineTransport;
      
      class CustomDoctrineTransport extends DoctrineTransport {
          protected function getTableName(): string {
              return 'custom_messages';
          }
      }
      
  3. Transaction Conflicts

    • Avoid dispatching messages inside transactions (use AsyncBus instead).

Debugging

  • Log Failed Messages Enable Symfony’s messenger logging:

    # config/packages/monolog.yaml
    handlers:
        messenger:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.messenger.log"
            level: debug
    
  • Check Worker Status Use:

    php bin/console messenger:failed-message-list messenger_db
    

Extension Points

  1. Custom Middleware Add middleware to the bus:

    # config/packages/messenger.yaml
    middleware:
        - App\Middleware\LoggingMiddleware
    
  2. Event Listeners Listen to MessageSentToTransportEvent or MessageFailedEvent:

    use Symfony\Component\Messenger\Event\MessageSentToTransportEvent;
    
    $dispatcher->addListener(
        MessageSentToTransportEvent::class,
        fn(MessageSentToTransportEvent $event) => Logger::info('Message sent!')
    );
    
  3. Doctrine Events Extend the transport to trigger events on message creation/failure:

    use Doctrine\ORM\Event\LifecycleEventArgs;
    
    $entityManager->getEventManager()->addEventListener(
        Message::class,
        [$this, 'onMessageFailure']
    );
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
roundly-consulting/kubernetes-api-for-laravel
roundly-consulting/plausible-for-laravel
gvp/gvp-laravel-template
metasyncsite/laravel-metasync-client
roundly-consulting/onboarding-for-laravel
andydefer/laravel-notification
adachsoft/cli-process-tester
jhaskell13/laraflow
sebastienheyd/boilerplate-media-manager
ccast/tagixo-primix
pretendtrue/laravel-builder
sawmainek/laravel-scout-tntsearch-driver
tomshaw/laravel-calendar-table
dibakar/laravel-ownership
steadrun/laravel-monitor
labyrinthe/connect-laravel
elmogy/layan
drewdan/sentinel-client
dskripchenko/laravel-llm
fatryst/nuonuo