evozon-php/entity-extend-bundle
Evozon EntityExtendBundle is a Symfony bundle for extending Doctrine entities with additional fields without modifying their classes. Configure extra attributes, persist values, and use them alongside existing entity data.
Architecture fit. The first thing a TPM must flag is a category mismatch: this is a Symfony bundle, not a Laravel package. It extends pjarmalavicius/PjEntityExtendBundle and depends on Symfony's bundle/DI/compiler-pass machinery plus Doctrine ORM event listeners and metadata drivers. It will not install into a Laravel application via Composer in any usable way — there is no service provider, no config publishing, no Laravel-facing API. If the target stack is Laravel/Eloquent, architectural fit is effectively zero; if the target stack is Symfony + Doctrine, fit is plausible but the package is a niche fork of an already-niche concept (runtime entity extension via generated/derived entities and extension tables — an EAV-adjacent pattern).
Integration feasibility. Low for a Laravel codebase. The bundle's value proposition is dynamic schema extension of Doctrine entities at the ORM metadata layer — it hooks entity mapping, generates extended entity classes, and routes persistence through Doctrine listeners. Reproducing that in Laravel means abandoning Eloquent for Doctrine (laravel-doctrine/orm), then re-implementing the bundle's compiler passes and listeners outside Symfony's container — a substantial custom port with no upstream support. A feasibility spike would realistically conclude "port the pattern, not the package."
Technical risk.
Key questions.
Stack fit. Poor-to-none for Laravel. The package assumes Symfony's Kernel, bundle registration, DI compiler passes, Doctrine's ClassMetadata/EventSubscriber pipeline, and YAML/annotation mapping conventions. Laravel's container, Eloquent models, and migration system share none of these primitives. Integration effort is not "configure and go" — it is "rewrite the mechanism."
Migration path (ranked, cheapest first).
jsonb columns with castable value objects — simplest, indexable in MySQL 8/Postgres, good for sparse custom fields.entity_id, key, value_type, value) with typed value columns — the classic EAV-lite approach, explicit and migratable.spatie/laravel-schemaless-attributes or laravel-metable for the same shape with maintained code.pjarmalavicius/PjEntityExtendBundle first, compare the fork's diff, and only adopt if the delta is small and the Symfony/Doctrine constraint matrix matches production.Compatibility. Verify Composer constraints against current Symfony LTS and Doctrine ORM 3.x. Given the fork's age and zero dependents, assume incompatibility until proven otherwise. Attribute-based mapping (PHP 8 attributes replacing annotations) is a likely break point.
Sequencing.
Maintenance. Adopting an unmaintained fork means the team owns it: forking, patching, tracking Symfony/Doctrine releases, and re-validating on every framework upgrade. Budget a recurring ~0.1–0.2 FTE indefinitely, or accept that it becomes a frozen pin blocking framework upgrades — which is a worse outcome.
Support. No vendor, no SLA, no active issue tracker to speak of, and no community to answer questions. Internal escalation path is "the one engineer who read the source." This is the highest-friction operational cost and should be stated plainly to stakeholders.
Scaling. Dynamic entity extension is EAV-adjacent by nature: it trades query simplicity and index efficiency for schema flexibility. Expect multi-table joins per entity load, more complex hydration, and performance that degrades with the number of extensions per entity. At scale, the runtime metadata manipulation also adds per-request overhead unless aggressively cached — and cache invalidation of generated entity classes is a classic operational footgun.
Failure modes.
composer update → blocked security patching of unrelated packages.Ramp-up. Steep and concentrated. The pattern is non-obvious, the documentation is a fork of an original's docs at best, and there are no tutorials, no Stack Overflow corpus, and no dependents to learn from. Realistic estimate: 3–5 days for a senior engineer to understand the mechanism, and a further 5–10 days before anyone can safely modify it. For a Laravel-only team, the effective ramp-up is "learn Symfony bundles and Doctrine internals first" — which is a different and much larger investment than the package itself warrants.
Recommendation. Reject for a Laravel stack outright. For a Symfony/Doctrine stack, treat as a last-resort option requiring a vendor-fork commitment and a documented upgrade burden. The underlying requirement (dynamic entity extension) is real and worth solving — but with a maintained alternative or a small internal implementation behind a stable interface, not with a zero-adoption fork.
How can I help you explore Laravel packages today?