enhavo/page-bundle
Enhavo Page Bundle is a subtree split of the Enhavo CMS, an open-source PHP content management system built on the Symfony framework. It provides page management functionality for building flexible content structures with a clean, usable interface. See the main repository for full documentation.
Architecture fit — the framing is wrong before anything else. enhavo/page-bundle is not a Laravel package. It is a Symfony bundle and an auto-generated subtree split of the Enhavo CMS monorepo. It assumes registration in a Symfony kernel (config/bundles.php), compilation through Symfony's DI container, and the presence of sibling bundles (resource, routing, block, media, admin). A Laravel application cannot host it in-process: Laravel's service providers are not a substitute for bundle extension semantics, and the dependency graph (Doctrine ORM/DBAL, HttpKernel, Form, Twig, multiple enhavo/* packages) collides with Eloquent, Blade, facades, and Laravel's own pinned symfony/* constraints. The realistic architecture fit for a Laravel codebase is zero; for a Symfony estate already running Enhavo it is native.
Integration feasibility — three paths, two of them real.
Technical risk. Distribution risk: the repo is explicitly read-only; issues, PRs, and release notes live upstream, and anything filed here is effectively lost. Adoption signal: 0 stars and 0 dependents on the split — the parent project has genuine usage, but the split has no independent community to catch regressions. Version coupling: tagged in lockstep with the monorepo, so pinning this package implicitly pins a large slice of Enhavo; you cannot patch it independently. Data-layer impedance: Enhavo is Doctrine-driven with its own schema tooling — sharing a database with Eloquent creates two schema owners and durable drift. Documentation risk: maturity is literally "readme"; the package-level API surface must be inferred from source and the main repo.
Key questions a TPM must close before commitment.
enhavo/* packages we would unavoidably pull in?TPM leverage point: this artifact's value is as a scoping and make-vs-buy input, not as a deliverable. It defines what "page management" means inside one vendor's stack and gives you a costed reference model; it carries no signal about ecosystem health, API stability, or CMS market position.
Stack fit. No clean fit with Laravel. Adopting it means a second framework, ORM, templating engine, container, and migration system. The only clean fits are (a) an existing Symfony app where Enhavo is already the CMS, or (b) a service-oriented architecture with Enhavo as a standalone content service.
Compatibility. Requires a Symfony kernel and Doctrine. Laravel shares only low-level Symfony components, pinned by Laravel's own constraints, so Composer will frequently find no satisfiable set. Treat dependency-resolution failure as the expected outcome, not the exception — verify this in a half-day spike before any design work.
Sequencing — service-oriented path.
Sequencing — reimplementation path.
pages table, polymorphic block storage (JSON or blocks table), slug-history table for redirects, published_at/expires_at scopes.Migration path. The service-oriented option keeps Enhavo behind a contract, so leaving later is a client-swap — a bounded change. That optionality is the main argument for the service model over any in-process attempt. Note the subtree split cannot be patched locally: splits are overwritten on sync, so any customization is either an upstream contribution or a genuine monorepo fork.
Maintenance. Two maintenance surfaces in the service model (Enhavo app + Laravel app) versus one in the reimplementation model. Enhavo upgrades arrive as monorepo-wide releases, and the read-only split ships no changelog, so upgrade triage begins upstream. Local patches to this bundle are not a durable option; plan for upstream PRs or a Composer patch layer.
Support. No vendor SLA. Community and upstream issue tracker only, and this repository is not a channel. For a TPM this is the decisive operational fact: you accept an unbounded support dependency on a project with no commercial backing and no independent adoption signal on the split package. Budget for internal ownership of any production usage.
Scaling. Page rendering is read-heavy and cacheable; either architecture scales with a CDN and page cache. The real cost is organizational: two runtimes mean two deploy pipelines, two observability stacks, two dependency-update cadences, and two security-patch streams. Design the Laravel client with aggressive caching so the CMS is off the critical path for anonymous traffic.
Failure modes to design against.
published_at/expires_at) are cached without TTL or invalidation on publish.Ramp-up. Requires Symfony/Enhavo-specific depth that a Laravel team does not carry. Expect several weeks before a engineer is productive in the bundle's source-defined model, and note the bus factor: this is typically a one-person dependency in a Laravel shop. The reimplementation path trades that ramp-up for a bounded build in a stack the team already knows, which is usually the better TPM trade.
How can I help you explore Laravel packages today?