xm/symfony-bundle
XM Symfony Bundle provides a Symfony integration layer for XM, including bundle registration, service definitions, and autowiring support, making it easy to add XM features to Symfony applications with minimal configuration.
Build vs. buy for an event-sourced backend. This bundle is effectively a "buy the internal standard" option: aggregates, commands/domain events, repositories, projections, Doctrine read models, GraphQL mutations/queries, and metadata enrichment (issuer, causation, IP, user agent) arrive pre-wired on Prooph. For a team about to hand-roll CQRS/ES, it converts a multi-sprint platform bet into an integration task — a decision that belongs in the roadmap review, not a sprint.
Time-to-market on new domain modules. make:model scaffolds the full vertical slice (aggregate, 3 commands, 3 events, handlers, repository, projection, read model, Doctrine entity/finder, GraphQL types + single/list/count queries + mutations, tests, YAML config). That gives you a defensible estimate for "add a new bounded context": hours of scaffolding plus a fixed 7-step manual wiring checklist (event stream creation, projection config, App\Projection\Table, RunProjectionMiddleware mapping, permissions, schema dump). Use it to size epics and to argue for investment in reducing that manual tail.
Platform standardization. Choosing this locks the product to Symfony + Prooph + Overblog GraphQL — not Laravel. If the org is Laravel-first, this is an explicit "we are running (or will run) a Symfony service" decision, with hiring and on-call implications.
Ops/roadmap de-scoping. Two baked-in capabilities are roadmap items teams usually fund separately: Maintenance Mode (file-triggered, no deploy, survives a non-booting app via front-controller gate, IP/CIDR + key bypass, GraphQL MAINTENANCE code with extensions.until, paused Messenger workers) and Session Expiry (idle logout matching gc_maxlifetime, remember-me aware, per-route _extend_session: false). Both can be cut from the backlog if this is adopted; both become migration scope if it is dropped.
API contract with frontend. Apollo-style extensions.code (UNAUTHENTICATED, FORBIDDEN, NotFoundError, LinkExpiredError, TooManyRequestsError, MAINTENANCE) plus schema-leak protection for anonymous users is a client-facing contract decision. The frontend must own a code list; that is a cross-team dependency to schedule, not a backend detail.
Vendor/dependency risk register. 0 stars, 0 dependents, "used at XM Media," no public docs beyond agent notes. This is an unvalidated single-vendor dependency; the PM decision is adopt-with-a-fork-plan, and the fork cost (reading source, owning Prooph upgrades) must be priced into the business case. Also verify the release metadata — the stated last release (2026-10-28) is out of sequence and should be confirmed before it appears in any roadmap artifact.
Adopt when:
make:model scaffolding dividend and will invest in shrinking the manual post-generation checklist.Look elsewhere when:
ContentDisposition, PasswordStrength, StringUtil, Faker providers) are portable, and copying them is cheaper than adopting the bundle.AggregateRoot, DomainMessage, UuidId, ValueObjectCollection) are a one-way door into Xm\SymfonyBundle\.For executives (one paragraph): This is XM Media's internal Symfony bundle that gives us event sourcing, CQRS, and GraphQL on a proven pattern rather than from scratch. It bundles three things we would otherwise fund separately: the domain/API plumbing, a code generator that produces a complete, tested module per domain entity, and the operational features we keep re-scoping — maintenance mode that flips without a deploy and works even when the app won't boot, plus correct idle-session expiry. The trade-off is dependency concentration: it is a single-vendor, zero-adoption package with no public support, so we adopt it only with source ownership (fork or vendored pin) and a named engineer accountable for Prooph/Symfony upgrades. Recommendation: adopt for Symfony services where event sourcing is already the decision, with a two-week spike to validate the generator's manual wiring tail and a documented exit cost; do not adopt for Laravel.
For engineering: It buys convention — strict types, immutable value objects, typed UUIDs, metadata enrichment, one canonical command → handler → aggregate → event → projection → GraphQL flow — and a generator that keeps every module structurally identical, which is the real win for onboarding and review. It costs you: reading the source instead of docs, owning upgrades to Prooph, and a fixed seven-step post-make:model wiring list that is your top candidate for internal tooling investment. Ask for: a pinned version, a fork branch policy, a smoke test that boots the app with maintenance mode on, and a frontend ticket for the GraphQL error-code contract.
How can I help you explore Laravel packages today?