parabol/parabol-doctrine-behaviors-bundle
Symfony bundle that integrates Doctrine behavioral extensions into your entities, automating common persistence logic such as timestamps, blameable user tracking, slugs, and soft deletes so you can drop repetitive boilerplate from your models.
Before writing any code, do the honest triage. This package has 0 stars, 0 dependents, and an unknown maintenance status, so treat it as unvetted third-party code rather than an established dependency. Open the repository and check three things first:
composer.json — PHP and doctrine/orm version constraints, plus whether it targets Symfony 5/6/7.src/ — which behaviors actually ship (timestampable, blameable, soft-deletable, sluggable, etc.) and whether they're trait-based or listener/attribute-based.Resources/config/ (or config/) and the bundle's DependencyInjection/…Extension.php — confirms the config alias and how services are wired.Framework reality check: despite the Laravel framing, this is a Symfony bundle, not a Laravel package. If you're in Laravel you are off the happy path: you need Doctrine installed (doctrine/orm or laravel-doctrine/orm) and the bundle's service/event subscribers registered manually, because Symfony bundles don't auto-discover in Laravel. Budget for that glue.
Install into a Symfony app:
composer require parabol/parabol-doctrine-behaviors-bundle
Then register in config/bundles.php and create config/packages/<alias>.yaml (verify the alias from the Extension class — see Gotchas). Pin an exact version and commit composer.lock; assume no maintainer will respond.
First use case: adopt one behavior on one entity — Timestampable (createdAt/updatedAt). It's the smallest surface area, trivially testable, and confirms the bundle's wiring, config alias, and event subscribers all work before you trust it with soft-deletes or slug generation. Write a single test that persists an entity and asserts the timestamps populate, then expand.
security.token_storage; in Laravel, provide a user resolver bound to the auth guard. The bundle's listener usually reads from a specific interface — implement it on your User entity.$em->getFilters()->enable(...)) or use scoped repositories consistently. Put this in a base repository, not scattered across controllers.doctrine:schema:validate and diff schema in CI before deploying — don't let behavior-generated columns surprise a production migration.doctrine:schema:validate → persist-and-assert feature test → only then touch the entity's existing tests. This catches listener-registration failures immediately.gedmo/doctrine-extensions (with standalone listener config) or stof/doctrine-extensions-bundle for Symfony instead of adopting an unmaintained fork.new \DateTime() (timezone bugs and untestable code), unbounded loops in onFlush, and any behavior that mutates other entities.config/packages/*.yaml uses the wrong root key, the config is ignored without error. Confirm the alias against the Extension class and check services load via debug:container.setUpdatedAt() alongside an automatic timestamp listener produces confusing values and extra UPDATE statements. Choose one owner.UPDATE/DELETE and raw DBAL skip prePersist/onFlush entirely — no timestamps, no slugs, no soft-delete. Handle bulk paths manually.doctrine:schema:validate in CI; use debug:event-dispatcher to confirm subscribers register.EventSubscriber on prePersist/onFlush rather than forking — you keep upgrade freedom and avoid inheriting an unmaintained branch.How can I help you explore Laravel packages today?