Install the Package
composer require dlakomski/message-bus
(Note: The package is a fork of simplebus/message-bus with no direct Laravel integration, so manual setup is required.)
Define a Message Interface
// app/Domain/Messages/ExampleMessage.php
namespace App\Domain\Messages;
interface ExampleMessage {}
Create a Message Handler
// app/Domain/Handlers/ExampleMessageHandler.php
namespace App\Domain\Handlers;
use App\Domain\Messages\ExampleMessage;
use SimpleBus\Message\Bus\MessageBus;
class ExampleMessageHandler
{
public function __invoke(ExampleMessage $message): void
{
// Handle the message
}
}
Register the Bus in Laravel
// config/app.php (Service Providers)
SimpleBus\MessageBus\MessageBus::class => function ($app) {
$bus = new \SimpleBus\MessageBus\MessageBus(
new \SimpleBus\MessageBus\Middleware\LogMessagesMiddleware(),
new \SimpleBus\MessageBus\Middleware\HandleMessageMiddleware(
new \SimpleBus\MessageBus\Middleware\CallHandlerMiddleware(
new \SimpleBus\MessageBus\Middleware\CreateMessageFromEnvelopeMiddleware()
)
)
);
return $bus;
},
Dispatch a Message
use App\Domain\Messages\ExampleMessage;
use SimpleBus\Message\Bus\MessageBus;
class SomeService
{
public function __construct(private MessageBus $bus) {}
public function triggerExample()
{
$this->bus->dispatch(new class implements ExampleMessage {});
}
}
CreateUserCommand).// Define Command
interface CreateUserCommand {}
// Handler
class CreateUserHandler {
public function __invoke(CreateUserCommand $command) {
// Logic here
}
}
// Dispatch
$bus->dispatch(new CreateUserCommand());
UserCreatedEvent).// Define Event
interface UserCreatedEvent {}
// Subscriber
class UserCreatedSubscriber {
public function __invoke(UserCreatedEvent $event) {
// Logic here
}
}
// Dispatch (fire-and-forget)
$bus->dispatch(new UserCreatedEvent());
$bus = new \SimpleBus\MessageBus\MessageBus(
new \SimpleBus\MessageBus\Middleware\LogMessagesMiddleware(),
// ... other middleware
);
class ValidateMessageMiddleware {
public function __invoke($message, callable $next) {
if (!$this->isValid($message)) {
throw new \RuntimeException("Invalid message");
}
return $next($message);
}
}
$this->app->bind(MessageBus::class, function ($app) {
return new MessageBus(
new \SimpleBus\MessageBus\Middleware\HandleMessageMiddleware(
new \SimpleBus\MessageBus\Middleware\CallHandlerMiddleware(
new \SimpleBus\MessageBus\Middleware\CreateMessageFromEnvelopeMiddleware()
)
)
);
});
SimpleBus\MessageBus\Middleware\RouteMessagesToHandlersMiddleware to route messages to specific handlers:
$bus = new MessageBus(
new RouteMessagesToHandlersMiddleware([
ExampleMessage::class => [new ExampleMessageHandler()],
]),
// ... other middleware
);
LogMessagesMiddleware → HandleMessageMiddleware → CallHandlerMiddleware → CreateMessageFromEnvelopeMiddleware
$bus = new MessageBus(
new LogMessagesMiddleware(), // Logs before/after
new HandleMessageMiddleware(
new CallHandlerMiddleware(
new CreateMessageFromEnvelopeMiddleware()
)
)
);
class HandleExceptionsMiddleware {
public function __invoke($message, callable $next) {
try {
return $next($message);
} catch (\Throwable $e) {
\Log::error("Message failed: {$e->getMessage()}");
throw $e; // Re-throw or handle silently
}
}
}
class ValidateMessageMiddleware {
public function __invoke($message, callable $next) {
if (!method_exists($message, 'validate')) {
throw new \RuntimeException("Message must implement validation");
}
$message->validate();
return $next($message);
}
}
SimpleBus\MessageBus\Middleware\AsyncMiddleware:
$bus = new MessageBus(
new AsyncMiddleware(new \Enqueue\Client()),
// ... other middleware
);
$mockBus = Mockery::mock(MessageBus::class);
$mockBus->shouldReceive('dispatch')->once();
$this->app->instance(MessageBus::class, $mockBus);
SimpleBus\MessageBus\Test\MessageBusTestCase for assertions:
$this->bus->shouldHaveDispatched(ExampleMessage::class);
laravel-queue).spatie/laravel-queueable-messages for queue support:
composer require spatie/laravel-queueable-messages
use Spatie\QueueableMessages\QueueableMessageBus;
$queueableBus = new QueueableMessageBus($bus, $this->app['queue']);
$bus = new MessageBus(
new LogMessagesMiddleware(\Monolog\Logger::create('message_bus')),
// ...
);
SimpleBus\MessageBus\Middleware\DebugMiddleware for dev environments:
$bus = new MessageBus(
new DebugMiddleware(),
// ...
);
SimpleBus\MessageBus\MessageBus:
class CustomMessageBus extends \SimpleBus\MessageBus\MessageBus {
public function dispatchWithRetry($message, int $retries = 3) {
// Custom logic
}
}
How can I help you explore Laravel packages today?