simple-bus/message-bus
Generic PHP interfaces and utilities for building message buses such as command buses and event buses. Provides reusable components to dispatch messages through middleware and handlers, forming the foundation for CQRS-style messaging in your app.
Installation
composer require simple-bus/message-bus
No Laravel-specific package exists, so use the core simple-bus/message-bus package.
Define a Message Create a simple DTO (Data Transfer Object) for your message:
// app/Domain/Commands/SendEmail.php
namespace App\Domain\Commands;
class SendEmail
{
public function __construct(
public string $email,
public string $subject,
public string $body
) {}
}
Create a Handler
Implement SimpleBus\Message\Handler\MessageHandlerInterface:
// app/Domain/Handlers/SendEmailHandler.php
namespace App\Domain\Handlers;
use App\Domain\Commands\SendEmail;
use SimpleBus\Message\Handler\MessageHandlerInterface;
class SendEmailHandler implements MessageHandlerInterface
{
public function handle(SendEmail $message)
{
// Logic to send email
mail($message->email, $message->subject, $message->body);
}
}
Register the Handler Use Laravel's service container to bind the handler:
// app/Providers/AppServiceProvider.php
use App\Domain\Handlers\SendEmailHandler;
use SimpleBus\Message\Handler\MessageHandlerInterface;
public function register()
{
$this->app->bind(
MessageHandlerInterface::class,
SendEmailHandler::class
);
}
Dispatch a Message
Use a MessageBus instance (injected via Laravel's container):
use SimpleBus\Message\Bus\MessageBus;
public function dispatchEmail()
{
$bus = app(MessageBus::class);
$bus->dispatch(new SendEmail('user@example.com', 'Hello', 'World!'));
}
Separation of Concerns
CreateUser, SendEmail).Middleware Integration Leverage middleware for cross-cutting concerns (logging, validation, retries):
// app/Providers/AppServiceProvider.php
use SimpleBus\Message\Bus\MessageBus;
use SimpleBus\Message\Middleware\Middleware;
public function register()
{
$bus = $this->app->make(MessageBus::class);
$bus->addMiddleware(new class implements Middleware {
public function handle($message, callable $next)
{
// Pre-processing (e.g., logging)
$result = $next($message);
// Post-processing
return $result;
}
});
}
Event Bus for Side Effects
// Inside SendEmailHandler
$bus->dispatch(new EmailSent($message->email));
Laravel-Specific Integration
Bus facade or inject MessageBus directly:use Illuminate\Support\Facades\Bus;
Bus::dispatch(new SendEmail(...));
Testing
MessageBus or use Bus::fake() for testing:use Illuminate\Support\Facades\Bus;
Bus::fake();
$bus->dispatch(new SendEmail(...));
Bus::assertDispatched(SendEmail::class);
Handler Registration
MessageHandlerInterface in the container.bind() or when() for conditional binding.Circular Dependencies
MessageBus can cause circular references.MessageBus into handlers. Use Laravel's Bus facade or resolve it via the container only when needed.Middleware Order
addMiddleware() for append and prependMiddleware() for prepend.Exception Handling
try-catch or use middleware to log/handle exceptions.Message Immutability
Logging Middleware Use the built-in logging middleware for visibility:
$bus->addMiddleware(new \SimpleBus\Message\Middleware\LoggingMiddleware());
Handler Discovery
MessageHandlerInterface.Performance
Custom Middleware Extend functionality with middleware (e.g., rate limiting, circuit breakers):
$bus->addMiddleware(new class implements Middleware {
public function handle($message, callable $next)
{
if ($this->shouldSkip($message)) {
return $next($message);
}
throw new \RuntimeException('Skipped!');
}
});
Message Validation Use middleware to validate messages before handling:
$bus->addMiddleware(new class implements Middleware {
public function handle($message, callable $next)
{
if (!filter_var($message->email, FILTER_VALIDATE_EMAIL)) {
throw new \InvalidArgumentException('Invalid email!');
}
return $next($message);
}
});
Retry Logic Implement retry middleware for transient failures:
$bus->addMiddleware(new \SimpleBus\Message\Middleware\RetryMiddleware());
Laravel Queues Integration Combine with Laravel Queues for async processing:
// Dispatch to queue
Bus::dispatch(new SendEmail(...))->onQueue('emails');
How can I help you explore Laravel packages today?