matiux/broadway-bundle
Symfony bundle that integrates Broadway, the event sourcing and CQRS library for PHP. It wires command and query buses, event stores, read models and event handlers into the container, so you can add CQRS and event sourcing to a Symfony app with minimal boilerplate.
Architecture fit
Dublin Bundle is a Symfony bundle, not a Laravel package. It integrates via Symfony's kernel/bundle mechanism (Bundle class, DI Extension, Configuration tree, compiler passes). Laravel has no bundle registry; it composes through service providers, facades, and its own container. That mismatch is the dominant finding: the "drop-in replacement" promise applies only to Symfony applications migrating off broadway/broadway-bundle, and does not extend to Laravel. In a Laravel codebase the package can only be consumed as a plain library whose Symfony-style wiring must be hand-rebuilt (service definitions translated to a service provider, config tree replaced with config/*.php, tagged services replaced with explicit bindings).
Integration feasibility Feasible but manual. Expect to: register the underlying Dublin library services yourself, publish/own the event store schema, and re-implement any bundle-provided conveniences (console commands, tagged handler discovery, config normalization). The 1.0.0 delta over 0.7.0 is effectively a rename plus compatibility housekeeping — there is no new capability to justify a fresh integration effort. Any team currently on Broadway Bundle should treat this as a low-effort swap; any team on Laravel should treat it as a from-scratch integration of a CQRS/ES library.
Technical risk
composer.json before any commitment.Key questions
php and symfony/* constraints, and which Symfony versions are in the CI matrix?config/bundles.php class rename and any config key change from broadway to dublin?Stack fit Poor for Laravel-first shops; good for Symfony shops already running Broadway. If the goal is CQRS/Event Sourcing inside Laravel, treat this evaluation as "adopt the Dublin library, not the bundle" and budget for an integration layer you own.
Migration path (Symfony, from Broadway Bundle)
broadway/broadway-bundle → matiux/dublin-bundle (and Broadway → Dublin 3.x) in composer.json.config/bundles.php with the new bundle class.Configuration tree.SimpleBus/serializer configuration; alias or update.Migration path (Laravel)
EventSourcingServiceProvider that binds the command bus, event bus, event store, and repository factory.EventStore implementation. Document this as owned code.Compatibility Verify PHP floor against the oldest runtime you support and against your Laravel/Symfony version pairing. Because Laravel ships Symfony components at pinned majors, the bundle's Symfony constraints may conflict or over-constrain your framework upgrade path — resolve this in a throwaway branch before committing.
Sequencing Phase 0: dependency spike and constraint resolution (no production code). Phase 1: single bounded context proof of concept with one aggregate, real event store, one projection. Phase 2: operational tooling — replay, rebuild, monitoring. Phase 3: broaden adoption context by context. Do not parallelize Phase 1 and Phase 3; the ES literacy gap is the schedule risk, not the package.
Maintenance You are adopting a fork of an unmaintained upstream. Assume you may need to vendor or fork again. Budget a standing allocation for dependency bumps on every Symfony/PHP major, and keep the integration layer (especially any Laravel adapter) thin and isolated so a future replacement is a contained change.
Support Community-only: GitHub issues, no SLA, no commercial backing apparent from the release notes. Internal escalation path is "we fix it." Identify an internal owner before adoption; do not let this land as an unowned transitive dependency.
Scaling Event sourcing shifts the scaling problem from request throughput to event store growth and projection throughput. Watch: table/index growth on the event store, snapshot frequency, projection lag, replay duration as the log lengthens, and serializer payload size. Replay time is the metric that quietly becomes an outage during incident recovery — measure it early and keep it inside your recovery objective.
Failure modes
Ramp-up The package is the easy part; CQRS/ES is not. Expect a real learning curve for engineers fluent in Laravel's Active Record idioms: aggregates, eventual consistency, projections, replay, and "the event log is the source of truth." In a Laravel shop, add Symfony DI familiarity on top. Plan for one experienced practitioner to own the pattern, a written internal standard for aggregates/events/upcasters, and a code-review checklist. Ramp-up time, not integration time, should drive the delivery estimate.
Recommendation No objection to Dublin Bundle 1.0.0 as a Symfony drop-in replacement for Broadway Bundle — it is a rename-grade release with modern-framework compatibility, and the migration is contained. For a Laravel target, do not adopt the bundle; evaluate the Dublin 3.x library directly, confirm the persistence story, and only proceed if the team has (or will fund) genuine ES capability. Either way, gate on the compatibility matrix and a named internal owner.
How can I help you explore Laravel packages today?