Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Doctrine Translatable Bundle Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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.

  1. Is any target service actually Symfony + Doctrine ORM, or is this being evaluated against a Laravel codebase? (If Laravel — reject.)
  2. What is the concrete translation requirement — user-facing content localization, or regulatory multi-language data retention? The latter needs auditability and query guarantees this package does not advertise.
  3. Which Symfony/Doctrine/PHP versions must be supported, and does the package's constraint set admit them?
  4. Why not Gedmo Translatable (gedmo/doctrine-extensions), which solves the same problem with a materially larger user base and active maintenance?
  5. Are we willing to fork and vendor this package under our own namespace? If no, the risk is unmitigable.
  6. What is the blast radius if a translation silently fails to persist — cosmetic, or a compliance event?

Integration Approach

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:

  1. Gedmo Translatable (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.
  2. Explicit translation entities — a hand-written 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.
  3. Fork and vendor 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.

  1. Spike in a throwaway Symfony app — install, register the bundle, mark one entity translatable, prove persist + hydrate + locale fallback end to end.
  2. Fork to our org, retarget version constraints, pin the fork by commit SHA (never a floating branch).
  3. Vendor the fork into our private package registry with a replace entry so Composer resolves it deterministically.
  4. Backfill integration tests covering: write in locale A, read in locale B, fallback when the translation is missing, and cascade behavior on parent delete.
  5. Only then onboard the first real entity; keep the translatable-entity list short and explicit.

Operational Impact

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.

  • Silent non-persistence — subscriber not registered after a config or container change; translation writes appear to succeed but the row is absent. Mitigate with an assertion test in CI, not just a unit test.
  • Locale fallback gaps — a missing translation returns empty rather than the default-locale value; visible to users, invisible to logs.
  • Version drift on framework upgrade — the subscriber tag or metadata driver signature changes and the behavior stops firing without error.
  • Cascade/orphan divergence — parent deletions leaving orphaned translation rows; needs FK constraints or a cleanup job.
  • Hydration overhead regression — a new query path bypasses the tuned fetch-join and the page slows without failing.

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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console
pnscripts/filament-broadquill-lite
pnscripts/laravel-sentfold-lite
vleap/mx-sdk-laravel-internal
twidpay/utils
htetmyathlaing/scout-elasticsearch-driver
artisan-toolbox/front-awesome
ls/client-assistant
users-au/laravel-client
cgv/localized-resource