prezent/doctrine-translatable-bundle
A Symfony bundle that adds translatable behavior to Doctrine entities, letting you store and retrieve localized field values through Doctrine ORM. It simplifies multilingual content models and translation management in Symfony applications with minimal, flexible configuration.
Stack mismatch is the headline finding. Despite the "Laravel/PHP package" framing, prezent/doctrine-translatable-bundle is a Symfony bundle — its only job is to register the prezent/doctrine-translatable Doctrine extension's event subscriber and metadata driver with the Symfony service container. It has no Laravel service provider, no Eloquent integration, and no Composer auto-discovery path that would make it usable in a Laravel application. If our target stack is Laravel, this is a non-starter and the evaluation ends here. Everything below assumes a Symfony + Doctrine ORM service is genuinely in scope.
Architecture fit. The package is thin by design: a compiler-pass-style wiring layer around a third-party Doctrine behavior. That is architecturally clean — it keeps translation logic in the entity layer where Doctrine extensions belong, and it avoids the anti-pattern of duplicating translation columns per locale in application code. The cost is that the bundle inherits every architectural constraint of the underlying extension: translatable entities must be Doctrine-managed, translations live in a companion table keyed by locale, and query behavior depends on the extension's hydration/listener machinery. Teams on raw query builders, DBAL-only access, or heavy DTO projection will get limited value.
Integration feasibility. Low technical effort, high diligence requirement. Wiring is a Composer require plus a bundle registration and a config block enabling the listener. The real feasibility work is version triangulation: this package predates modern Symfony (6/7) and Doctrine ORM 3.x conventions, and with 14 stars and 0 dependents there is no evidence base of anyone running it on a current stack. Expect to verify PHP constraint, symfony/framework-bundle constraint, doctrine/orm constraint, and whether the subscriber still uses the doctrine.event_subscriber tag (removed/deprecated in newer DoctrineBundle majors).
Technical risk — high, concentrated in abandonment. Signals are uniformly negative: 14 stars, 0 dependents, opportunity score ~42, overall 0.77. A package with zero dependents on Packagist has effectively never been installed in production by anyone outside the author. There is no community to absorb a CVE, no fork ecosystem to fall back on, and the upstream prezent/doctrine-translatable core library carries the same profile. The bundle is also a behavioral dependency — it hooks entity persistence and hydration — so a silent failure degrades data correctness rather than throwing loudly. That is the worst risk class for a small package.
Key questions.
gedmo/doctrine-extensions), which solves the same problem with a materially larger user base and active maintenance?Stack fit.
| Target stack | Fit | Note |
|---|---|---|
| Laravel / Eloquent | None | No service provider, no ORM bridge. Reject. |
| Symfony 6/7 + Doctrine ORM 3 | Unverified, likely requires fork | Version constraints almost certainly stale. |
| Symfony 4/5 + Doctrine ORM 2 | Plausible | The era the package was written for. |
| Non-Symfony PHP + Doctrine | None | Bundle layer is Symfony-specific; the core extension is the usable part. |
| API-only, read-heavy, DBAL query builders | Poor | Value depends on ORM hydration paths. |
Migration path. Do not plan a migration onto this package. Plan a decision between three options, ranked by durability:
gedmo/doctrine-extensions) — same conceptual model, orders of magnitude more adoption, active maintenance, Symfony bundle variants available. Default recommendation unless a specific feature gap exists.ProductTranslation entity with a locale column and a OneToMany. More boilerplate, zero third-party behavioral risk, fully debuggable, and it survives framework upgrades. For a bounded set of translatable entities this is usually the right long-term answer.prezent/doctrine-translatable-bundle — only if we are already committed to the core prezent/doctrine-translatable extension for reasons outside this evaluation (e.g., an existing schema built around it).Compatibility verification sequence. Before any code is written: clone, run composer why-not, attempt install against our locked Symfony/Doctrine/PHP matrix, and run the package's own test suite. If it does not install cleanly on day one, it will not survive our next framework major.
Sequencing if we proceed with a fork.
replace entry so Composer resolves it deterministically.Maintenance burden lands entirely on us. Upstream is effectively dormant, so every Symfony or Doctrine major becomes our migration. Budget roughly the cost of owning a small internal library — not the cost of consuming one. The fork must be assigned to a named owner with upgrade-cycle responsibility, or it will rot silently and fail during a framework bump.
Support. No SLA, no security policy, no release cadence, no maintainer redundancy. Vulnerability triage falls to us via composer audit, and because the bundle participates in persistence, a defect may surface as corrupted or missing translation rows rather than an exception. That makes incident response a data-repair exercise, not a rollback.
Scaling characteristics. The model is a companion table per translatable entity with one row per locale — write amplification scales linearly with locale count, and every read that needs a translated field triggers joins or post-load hydration. Two consequences worth planning for: (a) list endpoints over N entities × M locales need explicit fetch-join tuning or N+1 will appear in production, not in staging; (b) translation tables grow faster than their parents and are rarely in the hot path of an index strategy — expect to review indexes and possibly add read-side caching for locale-stable content.
Failure modes to instrument for.
Ramp-up. Low for a developer who already knows Doctrine's event system and entity metadata; moderate for one who does not. The package's own documentation surface is thin (this is a 14-star bundle — assume a README and no more), so ramp-up cost is really "read the upstream Doctrine extension's source" rather than "read the bundle's docs." Estimate half a day for a Doctrine-fluent engineer to be productive, plus one to two days to author the integration test suite that upstream does not provide. The fork-and-pin step adds a small but permanent operational tax on every dependency refresh.
Recommendation. Reject on stack-fit grounds alone if the target is Laravel. If the target is Symfony + Doctrine, treat this package as an unmaintained behavioral dependency and default to Gedmo Translatable or an explicit translation entity; pursue the fork-and-vendor path only where an existing schema already commits us to the prezent/doctrine-translatable core.
How can I help you explore Laravel packages today?