broadway/broadway-bundle
Symfony bundle that integrates Broadway CQRS/ES into your app. Symfony Flex installs and configures it automatically, with in-memory event store and read models by default and options for persistent implementations. Documentation available at broadway.github.io.
spatie/laravel-symfony-messenger or custom bridges.Flex autoconfiguration, requiring manual service registration (e.g., EventStore, CommandBus).laravel-package-boilerplate) to create a wrapper bundle.illuminate/database) can integrate with broadway/event-store-dbal.CommandBus can replace Laravel’s native command bus, enabling asynchronous processing (e.g., via queues).ServiceProvider or using Laravel’s Facades.Event system differs from Broadway’s DomainEvent. A bridge layer (e.g., converting Laravel events to Broadway domain events) may be needed.MetadataEnricher or saga logic.| Risk Area | Severity | Mitigation Strategy |
|---|---|---|
| DI Container Mismatch | High | Use symfony/dependency-injection as a Laravel package or mock Symfony’s container. |
| Event Store Persistence | Medium | Prefer broadway/event-store-dbal (Doctrine-compatible) over MongoDB for Laravel’s SQL-first ecosystems. |
| Performance Overhead | Medium | Benchmark in-memory vs. DBAL stores; consider Laravel Queues for async command handling. |
| Learning Curve | High | Requires understanding of event sourcing, CQRS, and Broadway’s terminology (e.g., Projectors, Sagas). |
| Lack of Laravel Ecosystem | High | Build a wrapper package (e.g., laravel-broadway) to abstract Symfony-specific code. |
event-store-dbal)?DomainEvents?| Laravel Component | Broadway Equivalent | Integration Strategy |
|---|---|---|
| Eloquent Models | Aggregate Roots | Use Broadway’s AggregateFactory + custom repositories. |
| Laravel Queues | Command Bus + Event Store | Dispatch commands via broadway.command_bus; process asynchronously. |
| Laravel Events | Domain Events | Create a bridge to emit Laravel events from Broadway projectors. |
| Scout/Algolia | Elasticsearch Read Model | Use broadway/read-model-elasticsearch. |
broadway/event-store-dbal (Doctrine DBAL) + Laravel’s database package.broadway/read-model-mongodb (if JSON queries needed) or custom Eloquent projectors.CommandBus (e.g., dispatchSync() for sync, dispatch() for async).Phase 1: Proof of Concept (PoC)
broadway/broadway-bundle in a Symfony micro-app (or Laravel with Symfony DI emulation).Order) with:
dbal).CreateOrderCommand).laravel-debugbar to inspect Broadway services.Phase 2: Laravel Wrapper Package
laravel-broadway) that:
CommandBus, EventStore, etc./laravel-broadway
/src
- BroadwayServiceProvider.php
- Facades/
- Broadway.php (e.g., `Broadway::dispatch($command)`)
- Bridges/
- LaravelEventToBroadwayBridge.php
Phase 3: Full Integration
bind()/singleton(); Symfony uses set() in config. Use a container adapter (e.g., symfony/dependency-injection in Laravel).config/packages/broadway.yaml → Laravel’s config/broadway.php.Route::post('/orders', [OrderController::class, 'create'])->name('orders.create');).HttpFoundation with Laravel’s Illuminate\Http. Use abstraction layers (e.g., PSR-7 interfaces).User or Order with 2–3 events (e.g., UserRegistered, OrderCreated).dbal or MongoDB.How can I help you explore Laravel packages today?