polishsymfonycommunity/doctrine-extensions-bundle
Symfony bundle that integrates Doctrine extensions such as Gedmo Sluggable, Timestampable, Tree, Translatable, and Loggable, with simple configuration and service registration for adding common behavioral features to Doctrine entities.
Architecture fit: Poor — the package is not a Laravel package. polishsymfonycommunity/doctrine-extensions-bundle is a Symfony bundle that registers and configures the Gedmo/Atlantic18 DoctrineExtensions Blameable listener (auto-populating createdBy / updatedBy on persist/update). Its actual value is Symfony DI wiring — a small service definition plus config tree — around code that lives in gedmo/doctrine-extensions. Laravel has no bundle/kernel registration concept, and its default persistence layer is Eloquent, not Doctrine ORM. There is no architectural seam where this package plugs in.
Integration feasibility: Very low, and not worth pursuing. To use it at all you would need laravel-doctrine/orm in the stack, then reimplement the bundle's ~100 lines of container configuration by hand, because Symfony's bundle discovery and Configuration/Extension classes do not execute under Laravel's service container. At that point you are not leveraging the package — you are using Gedmo directly and paying a translation tax. The business capability requested (audit stamping of created_by / updated_by) is roughly 30–60 lines of idiomatic Laravel: an Auditable trait, an updating/creating model observer, and a nullable FK migration.
Technical risk: High, effectively unquantifiable. The package is archived, has 11 stars, zero dependents, and a composite score of 0.23 — no downstream validation, no maintainer, no security response path. It is Doctrine2-era: expect Composer constraints pinned to symfony/symfony ^2.x, php ^5.x/^7.x, and doctrine/orm ^2.x, which will conflict with modern illuminate/* components and current PHP runtimes. Doctrine\Common\Persistence\* namespaces used in that era were removed, so a --ignore-platform-reqs install is likely to fail at runtime, not install time — the worst failure mode.
Key questions for the requesting team:
owen-it/laravel-auditing.stof/doctrine-extensions-bundle + gedmo/doctrine-extensions, not this fork.Recommendation: Do not adopt. Treat this as a capability signal, not a package candidate. Record the decision as "rejected — archived, wrong framework, wrong ORM, zero adoption," and implement the behavior natively.
Stack fit: None. Laravel + Eloquent is the default and the only path with first-class support. Laravel + Doctrine is a viable but minority stack; even there, the supported route is laravel-doctrine/extensions, which already wraps Gedmo listeners — installing a Symfony bundle on top is strictly redundant.
Recommended implementation (Laravel/Eloquent):
| Concern | Native approach |
|---|---|
| Schema | $table->foreignId('created_by')->nullable()->constrained('users'), same for updated_by |
| Behavior | Auditable trait + Model::creating / Model::updating hooks (or a single observer) |
| Actor resolution | Auth::id() with an explicit fallback for console/queue contexts |
| Provenance | Optional AuditableResolver interface so jobs and impersonation can override the actor safely |
Migration path (if a Doctrine layer genuinely exists): Use gedmo/doctrine-extensions directly, register the BlameableListener as a Doctrine event subscriber in a service provider, and set the user via an event listener on Laravel's auth events. Do not attempt to port the bundle.
Compatibility: Expect hard conflicts. The bundle's composer.json will pin Symfony 2 components that illuminate/support and modern Symfony packages cannot co-install with. Any attempt to force it requires replace/provide hacks or a fork, both of which convert a 1-day task into an open-ended maintenance liability.
Sequencing: (1) Confirm the requirement is column stamping, not full audit trail. (2) Timebox a 2-hour spike to prove the install fails — this is useful evidence for the decision record. (3) Implement the native trait + migration + tests. (4) Backfill existing rows to a known sentinel (null or system user) with a documented decision. Total: one engineer-day.
Maintenance: Full ownership transferred to us on day one. Archived means no upstream patches, no PHP-version bumps, no Doctrine-version bumps, no CVE response. Because it is a thin config layer, the real dependency risk is Gedmo's listener underneath — you inherit that risk without inheriting its maintenance cadence. A fork is mandatory if you proceed, which means a named owner, a mirror, and a review obligation at every PHP/framework upgrade.
Support: None. No issue triage, no maintainer response, no documented upgrade path. Any production defect is diagnosed by reading vendor source. This is acceptable for a vendored 50-line utility; it is not acceptable for a dependency in the persistence write path.
Scaling: Modest direct cost, real indirect cost. Blameable adds no meaningful query overhead (it mutates the entity before flush), but it does add a hard coupling between every write and an actor-resolution service. Under high write concurrency the listener is cheap; the operational hazard is the stamp semantics — user resolution failing open (null actor) silently degrades audit quality, and that degradation is invisible until an audit is requested.
Failure modes to plan for:
null. Must be designed, not defaulted.Ramp-up: Low conceptually, negative in practice. The domain concept (audit stamping) is understood by any mid-level engineer in an hour. The cost is that engineers spend time reverse-engineering a dead Symfony bundle, evaluating whether it should work, and then discovering the actor resolver has no Laravel analogue. The native implementation is faster to build, faster to onboard, and readable to every Laravel engineer on the team.
Net TPM position: Reject the package, capture the underlying requirement, ship the native implementation, and add "archived + framework mismatch" as an explicit intake filter so similarly low-signal packages stop reaching evaluation.
How can I help you explore Laravel packages today?