kaliop/content-decorator-bundle
A Symfony bundle from Kaliop that adds a decoration layer for content objects, letting you attach custom presentation methods and computed values without changing the underlying content model. Helps keep templates clean by moving view-specific logic into reusable decorators.
Architecture fit — first-order mismatch to resolve before anything else. This is a Symfony bundle for Ibexa (formerly eZ Platform), not a Laravel package. If our stack is Laravel, the assessment ends here: the src/bundle layer is a Symfony DI extension and there is no Laravel service provider, facade, or config bridge. The three-layer split is nonetheless well designed for our purposes: src/contracts is the declared stable API surface, src/lib holds mappers/factories/repositories/events, and src/bundle is pure wiring. That means the valuable part — a typed model and repository layer over Ibexa's untyped Content/ContentInfo/field-value API — is nominally separable, though it will carry Symfony service and Ibexa repository-interface dependencies that make extraction more work than the layer names imply.
Where the value actually is. Ibexa integrations rot because domain code ends up threaded through ContentService, remote IDs, field identifiers, and version/language bookkeeping. A typed repository layer converts that into testable PHP objects and is a real quality and velocity gain for any team maintaining Ibexa content types. This is a narrow, credible utility — not a framework.
Integration feasibility — high inside Ibexa, low outside. Composer install is trivial; the binding constraint is the platform matrix. 2.x pins Ibexa 5.0 + Symfony 7.4 LTS + PHP 8.3+. 1.x pins Ibexa 4.6 + Symfony 5.4 LTS + PHP 8.1+. The maintainers explicitly forbid widening constraints for a major line. That is good discipline but means our upgrade calendar is now coupled to theirs.
Technical risk — high on ecosystem, low on code. Two stars and zero dependents means no downstream validation, no community troubleshooting, and the appearance of a single maintainer. The release metadata (2026-06-03) should be treated as unreliable until we verify actual tags on the repository. Countervailing signal is unusually strong engineering hygiene for a project this size: deptrac-enforced layering, PHPStan, coding-standard checks, SemVer policy, maintenance branches, and tag-driven CI releases to Packagist. That combination means a fork is cheap to own — the scope is small and the quality gates are already written.
Key questions.
src/contracts cover our top content types and field types without patching src/lib?Stack fit. On Symfony/Ibexa: adopt. On Laravel: reject, or re-scope to porting src/lib behind our own interfaces rather than bridging Symfony's container into Laravel's. The glue cost is not justified by the payload.
Migration path. Greenfield Ibexa 5.0 work: start on 2.x. Existing Ibexa 4.6: start on 1.x, and treat 1.x → 2.x as a planned major with contract-level API changes, budgeted alongside the Ibexa 4.6 → 5.0 jump. Never mix major lines across environments.
Compatibility. Mirror the upstream matrix in CI (PHP 8.3, Symfony 7.4, Ibexa 5.0) and validate with composer validate --strict plus a full install into a representative Ibexa app. Confirm no conflicts with the bundles already installed.
Sequencing.
src/contracts against our top five content types and field types; anything missing is a fork patch, so size it now.Maintenance. Low steady-state cost, spiky at platform upgrades. We inherit their constraint matrix, so every Symfony or Ibexa major arrives as a coordinated three-way upgrade. MIT licensing makes a fork viable; estimate a few engineer-days per platform major to rebase a private patch set, given the small codebase and the pre-existing cs/phpstan/deptrac gates.
Support. Effectively self-support. GitHub issues only, no SLA, no stated security policy, and no dependents to mine for prior art. Mitigations: name an internal owner, pin the version, and monitor Symfony/Ibexa advisories independently — this package will not surface them for us.
Scaling. Runtime scaling is Ibexa's concern, not the decorator's. The risk is mapping overhead and N+1 behavior when hydrating content lists that traverse relations and locations. Load-test list-heavy endpoints before broad rollout and check whether repositories expose any identity map or caching layer.
Failure modes.
src/lib from Ibexa minor API changes, which SemVer for this package does not protect us against.Ramp-up. The learning curve is Ibexa, not this bundle. A mid-level PHP developer needs roughly one to two weeks to be productive, and most of that is content-versus-content-info, versions, languages, locations, and remote IDs. Onboarding material should be the src/contracts namespace and our anti-corruption layer, not the README.
Recommendation. Proceed with a two-week spike if and only if we run Ibexa 5.0 (or 4.6 via 1.x) and can name an internal owner. If the stack is Laravel, treat this as out of scope.
How can I help you explore Laravel packages today?