Installation Add the bundle via Composer:
composer require dbp/relay-base-bundle
Register the bundle in config/app.php under providers:
DBP\RelayBaseBundle\RelayBaseBundle::class,
First Use Case Use the bundle’s core features for event-driven data relay (e.g., forwarding logs, metrics, or notifications between microservices). Example:
use DBP\RelayBaseBundle\Relay\RelayInterface;
// Inject RelayInterface via DI (configured in bundle)
$relay = $this->container->get(RelayInterface::class);
// Publish an event (e.g., "user.created")
$relay->publish('user.created', ['user_id' => 123]);
Configuration
Check config/packages/dbp_relay_base.yaml for default settings (e.g., transport adapters like RabbitMQ, Redis, or HTTP). Override as needed:
dbp_relay_base:
transports:
rabbitmq:
dsn: 'amqp://guest:guest@localhost:5672/%2f'
exchange: 'relay_events'
Event Publishing
Use RelayInterface to emit events with metadata:
$relay->publish('order.processed', [
'order_id' => $order->id,
'status' => 'paid',
'metadata' => ['customer_id' => 456]
]);
ecommerce.order.*).Event Subscribing
Implement DBP\RelayBaseBundle\Relay\SubscriberInterface:
class OrderSubscriber implements SubscriberInterface {
public function handle(string $eventName, array $payload): void {
if ($eventName === 'order.processed') {
// Process payload (e.g., update inventory)
}
}
}
Register subscribers in services.yaml:
services:
App\Subscriber\OrderSubscriber:
tags: ['dbp_relay.subscriber']
Transport Abstraction Swap transports dynamically via configuration (e.g., switch from RabbitMQ to Redis for testing):
dbp_relay_base:
transports:
default: 'redis' # Override default transport
$relay->publish('user.login', ['ip' => request()->ip()]);
// Fallback: event(new UserLoggedIn(request()->ip()));
public function handle($request, Closure $next) {
$response = $next($request);
if ($request->relayEvent) {
$this->relay->publish('api.request', [
'path' => $request->path(),
'status' => $response->status()
]);
}
return $response;
}
Transport Failures
dbp_relay_base.yaml:
dbp_relay_base:
retry:
max_attempts: 3
delay: 100 # ms
Subscriber Order
services.yaml:
tags: ['dbp_relay.subscriber', { priority: 100 }]
Payload Size Limits
Enable Logging:
Add to config/logging.php:
channels:
relay:
driver: single
path: storage/logs/relay.log
level: debug
Then configure the bundle to use this channel:
dbp_relay_base:
logging_channel: 'relay'
Test Locally:
Use the in_memory transport for development:
dbp_relay_base:
transports:
default: 'in_memory'
Custom Transports
Implement DBP\RelayBaseBundle\Transport\TransportInterface:
class S3Transport implements TransportInterface {
public function publish(string $event, array $payload): void {
// Upload to S3 with event as key
}
}
Register in services.yaml:
services:
App\Transport\S3Transport:
tags: ['dbp_relay.transport']
Event Transformers Modify payloads before publishing:
$relay->publish('user.created', ['user_id' => 123], [
'transformer' => function ($payload) {
$payload['timestamp'] = now()->toIso8601String();
return $payload;
}
]);
Security
$cleanPayload = array_map('htmlspecialchars', $payload);
$relay->publish('user.input', $cleanPayload);
How can I help you explore Laravel packages today?