artox-lab/clarc-message-bus-bundle
Install the Bundle
composer require artox-lab/clarc-message-bus-bundle
Enable in config/bundles.php:
ArtoxLab\Bundle\ClarcMessageBusBundle\ArtoxLabClarcMessageBusBundle::class => ['all' => true],
Configure Core Dependencies
Define your event library (e.g., your-lib/bus-event-message) in config/services.yaml:
app_message_bus.producer.bus_event_message_factory:
class: YourLib\BusEventMessage\V1\BusMessageFactory
ArtoxLab\AbstractBusEventMessage\V1\BusMessageFactoryInterface: '@app_message_bus.producer.bus_event_message_factory'
First Use Case: Publish an Event
Create a custom event (extending BaseEvent from your library) and dispatch it:
use YourLib\BusEventMessage\V1\Events\BaseEvent;
class OrderCreatedEvent extends BaseEvent {
public function __construct(public string $orderId) {}
}
// Dispatch via Messenger
$this->bus->dispatch(new OrderCreatedEvent('123'));
Event Creation
Extend BaseEvent from your library (e.g., YourLib\BusEventMessage\V1\Events\BaseEvent) for all domain events.
Example:
class UserRegisteredEvent extends BaseEvent {
public function __construct(public string $userId, public string $email) {}
}
Message Serialization
Configure messenger.yaml to use the bundle’s serializer:
transports:
rabbitmq:
serializer: artox_lab_clarc_message_bus.transport.bus_serializer
Middleware Integration
Add middleware (e.g., retry logic) in messenger.yaml:
buses:
message.bus:
middleware:
- validation
- artox_lab_clarc_message_bus.middleware.add_redelivery_stamp_middleware
Routing Events Route events to specific transports (e.g., RabbitMQ):
routing:
'YourLib\BusEventMessage\V1\Events\UserRegisteredEvent': [rabbitmq]
Consumption
Use Symfony Messenger’s MessageBus to consume events:
use Symfony\Component\Messenger\MessageBusInterface;
class OrderHandler {
public function __invoke(OrderCreatedEvent $event, MessageBusInterface $bus) {
// Handle event logic
}
}
services.yaml.RabbitMqBundle to auto-create queues:
php bin/console rabbitmq:setup-fabric
php bin/console messenger:setup-transports
validation middleware for incoming messages.Missing Event Library
The bundle requires a custom event library (e.g., artox-lab/abstract-bus-event-message). Forgetting to configure this in services.yaml will cause runtime errors.
Fix: Ensure all interfaces (BusMessageFactoryInterface, BusMessageInterface, EventInterface) are bound to your library’s implementations.
RabbitMQ Topic Exchange Quirks
RabbitMqBundle or manually configure queues.# for wildcards) match your event routing.
Fix: Run php bin/console rabbitmq:setup-fabric after defining exchanges.Middleware Order Matters
The add_redelivery_stamp_middleware must be last in the middleware chain to correctly stamp messages for retries.
Fix: Place it after validation but before doctrine or failed middleware.
Serialization Issues
Custom event classes must be serializable (e.g., no closures, resources). Use __serialize()/__unserialize() if needed.
Fix: Extend BaseEvent and ensure all properties are public or use getters/setters.
%env(RABBITMQ_TRANSPORT_DSN)% is correctly set in .env.logger middleware to debug message flow:
messenger:
buses:
message.bus:
middleware:
- validation
- logger # Add this for debugging
symfony/messenger:transport:list and symfony/messenger:consume commands to verify setup.Custom Middleware
Extend the bundle’s middleware (e.g., AddRedeliveryStampMiddleware) by creating a new middleware class and adding it to messenger.yaml:
buses:
message.bus:
middleware:
- your_namespace.middleware.custom_middleware
Transport Serializer
Override the default serializer by binding a custom class to artox_lab_clarc_message_bus.transport.bus_serializer in services.yaml.
Event Metadata
Add metadata to events via BaseEvent (e.g., getMessageId(), getOccurredOn()) for traceability in logs.
How can I help you explore Laravel packages today?