Installation:
composer require dlakomski/asynchronous-bundle
Add to config/bundles.php:
return [
// ...
SimpleBus\AsynchronousBundle\SimpleBusAsynchronousBundle::class => ['all' => true],
];
Configuration:
Edit config/packages/simple_bus_asynchronous.yaml to define:
queue (e.g., doctrine, symfony, or custom)middleware (e.g., SimpleBus\Asynchronous\Middleware\RetryMiddleware)handlers (map message types to handler classes).First Use Case:
Create a message class (e.g., app/Message/ProcessOrder.php):
namespace App\Message;
class ProcessOrder {}
Register it in config/packages/simple_bus_asynchronous.yaml:
handlers:
App\Message\ProcessOrder: App\Handler\ProcessOrderHandler
Dispatch it in a controller:
use SimpleBus\Message\Bus\Bus;
public function handle(Bus $bus) {
$bus->handle(new ProcessOrder());
}
Synchronous-to-Asynchronous Transition:
Use Bus interface for synchronous calls, but configure AsynchronousBundle to offload specific messages to queues.
Example: Mark a handler as async by injecting AsynchronousBus:
public function __construct(private AsynchronousBus $bus) {}
Queue Integration:
doctrine/doctrine-queue-bundle.
Configure in config/packages/simple_bus_asynchronous.yaml:
queue: doctrine
symfony/messenger as the transport:
queue: symfony
Middleware Stack: Extend the default middleware (e.g., add logging):
middleware:
- SimpleBus\Asynchronous\Middleware\RetryMiddleware
- App\Middleware\LogAsyncMessageMiddleware
Handler Design:
public function __construct(private OrderRepository $orders) {}
Testing:
AsynchronousBus in unit tests:
$bus = $this->createMock(AsynchronousBus::class);
$bus->expects($this->once())->method('handle');
doctrine/queue-bundle's test utilities).Queue Configuration Mismatch:
doctrine, symfony, etc.) is installed and properly set up.simple_bus_asynchronous.queue in Symfony’s container dump.Handler Registration:
config must match exactly (including namespace).Middleware Order:
config. Place RetryMiddleware early to avoid wasted retries.Transaction Boundaries:
EventDispatcher for transactional events instead.Debugging:
php bin/console doctrine:queue:list
failed_jobs table (Doctrine) or Symfony Messenger’s failure transport.Performance:
AsynchronousBus::handle() for one-off messages; prefer Bus for synchronous workflows.Extensibility:
SimpleBus\Asynchronous\Queue\Queue for non-Doctrine/Symfony transports.SimpleBus\Asynchronous\HandlerResolver\HandlerResolver to resolve handlers dynamically.Configuration:
config/packages/simple_bus_asynchronous.yaml per environment (e.g., disable async in tests).middleware:
- SimpleBus\Asynchronous\Middleware\RetryMiddleware
- SimpleBus\Asynchronous\Middleware\LogMiddleware
Error Handling:
SimpleBus\Asynchronous\Middleware\HandleFailedMessageMiddleware to customize failure behavior.public function handle(FailedMessage $failedMessage) {
// Log or notify (e.g., Slack)
}
Laravel-Specific:
AppServiceProvider:
$this->app->register(SimpleBusAsynchronousBundle::class);
php bin/console doctrine:queue:consume --time-limit=3600
How can I help you explore Laravel packages today?