patchlevel/event-sourcing-admin-bundle
Patchlevel Event Sourcing Admin Bundle adds a Symfony admin UI for event-sourced apps: browse aggregates and events, inspect projections, replay or rebuild state, and debug your event store from one dashboard.
Architecture fit. patchlevel/event-sourcing-admin-bunde is a Symfony bundle providing an admin/inspection UI over an event-sourced store built on patchlevel/event-sourcing. Architecturally it is a read-only, developer/ops-facing surface: browsing aggregates, inspecting streams, replaying or projecting events, and exporting data. It is additive — it does not own domain state and should sit outside the write path. That is a good fit for teams already committing to the patchlevel ecosystem; it is not a fit for Laravel-first applications, despite being a PHP package. It registers routes, controllers, Twig views, and security voters through the Symfony kernel, and expects Symfony's request/DI/security primitives. Flag this explicitly to stakeholders: the request refers to a "Laravel/PHP package," but this is a Symfony bundle.
Integration feasibility. Reasonable but non-trivial. You need (a) an existing patchlevel/event-sourcing store with a compatible schema/version, (b) a Symfony application (or a separately deployed Symfony admin service pointed at the same database), (c) firewall/access-control configuration so the admin routes are not publicly reachable, and (d) an export/CSV path that the alpha8 change touches. Because the bundle is at 1.0.0-alpha8, there is no stable configuration contract — expect to read source and bundle config rather than rely on docs.
Technical risk. Moderate-to-high, concentrated in three places:
app.request.get query/attribute refs, PR #47). That fix suggests filter/query behaviour in the UI was silently reading the wrong request bag — meaning prior alpha results may have been subtly wrong. Any evaluation done on alpha7 or earlier should be re-run.fputcsv/str_getcsv $escape deprecation). Good hygiene, but it is a behaviour change in how exported fields are quoted: any downstream consumer that parsed exports with the old default escape (\) may see different quoting. Low blast radius, but it is a data-format change in an ops tool.Key questions for the maintainer/vendor:
1.0.0 stable, and will the config schema be frozen before then?patchlevel/event-sourcing versions and which Symfony LTS versions are supported by alpha8? Is there a supported-version matrix?@gzumba's contribution (first-time contributor) covered by the project's review/CI gates, and what is the release cadence?Stack fit. Symfony 6.x/7.x with patchlevel/event-sourcing on the same database. If the estate is Laravel, this bundle is the wrong layer: either stand up a small dedicated Symfony admin service that connects read-only to the event store, or defer and revisit at 1.0.0 stable. Do not attempt to bridge Symfony bundle routing into a Laravel app.
Migration path. There is no migration from a prior stable version — this is the alpha line. Treat integration as a greenfield pilot:
1.0.0-alpha8 exactly in composer.json (no caret range on an alpha) and commit the lock file.Compatibility. Verify PHP version against the PHP 8.4 fputcsv signature work; verify Twig, Symfony, and Doctrine DBAL constraints from the lock file. If the application is on an older Symfony minor, expect composer conflicts from the bundle's own constraints.
Sequencing. (1) Version/constraint audit and pinning → (2) isolated read-only deployment → (3) security review of routes and voters → (4) correctness re-validation of filters and exports → (5) internal user pilot with ops/on-call → (6) decide on production exposure only after 1.0.0 stable ships or a clear support commitment is obtained.
Maintenance. Low code footprint, but ongoing attention required: expect a release every few weeks through the alpha series, plus Renovate lock-file PRs. Budget roughly a half-day per bump for review, re-pin, and smoke test while pre-1.0. Budget a larger one-off at the alpha→stable transition, where config keys and route names are most likely to move.
Support. Community-maintained (patchlevel), no vendor SLA evidenced in the release history. Internal ownership must be assigned — realistically the platform/backend team that owns the event store — with a documented fallback: if the bundle breaks, operators revert to direct SQL/DQL queries against the event tables.
Scaling. The admin UI is human-paced, so request volume is negligible. The real scaling concerns are (a) unbounded aggregate/stream listings against a large event store, which can produce slow or memory-heavy queries, and (b) export jobs over wide streams. Mitigate with read-replica routing, pagination limits, query timeouts, and scheduling exports off-peak. Do not let this bundle become a de facto reporting/BI path — that is how it becomes a production dependency it was never designed to be.
Failure modes. Most likely: broken admin access after a Symfony or DBAL upgrade; incorrect or empty filter results (the class of bug alpha8 just fixed) leading an operator to a wrong conclusion about event state; malformed or differently-quoted CSV exports silently breaking downstream parsers; and unauthorized exposure of admin routes if firewall config is missed during a deploy. Each is cheap to detect with smoke tests and a route-level access check in CI, and expensive to discover in an incident.
Ramp-up. One engineer can integrate and validate in roughly 2–3 days given an existing event store and Symfony app; add 1–2 days for security review and export validation. Documentation is thin at alpha, so plan for source-reading. On-call runbooks should state plainly that this is an inspection tool: it must never be on the critical path for serving customer traffic, and its unavailability is a degraded-tooling event, not a service outage.
Recommendation. Approve as a scoped, read-only, non-production pilot pinned to 1.0.0-alpha8, with re-validation of filter and export behaviour required because of PRs #43 and #47. Defer production exposure of the admin surface until 1.0.0 stable or an explicit support commitment; revisit the assessment at that point.
How can I help you explore Laravel packages today?