About doctrine-events
doctrine-events is a Symfony development skill for handling entity-persistence side effects and Doctrine event design, including ORM 3 subscriber migrations. It explains how to select and wire callbacks or listeners, then validate behavior with a functional test against a real database.
Key features
- 01Choose callbacks or listener types
- 02Configure listeners with attributes
- 03Use per-event argument classes
- 04Test side effects against a real database
- 05Apply ORM 3 migration safeguards
Use cases
- 01Adding persistence-time timestamps or slugs
- 02Moving search indexing or notifications to events
- 03Migrating Doctrine subscribers for ORM 3
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ dev-toolings/ superpowers-symfony --skill doctrine-eventsAfter installing, type/doctrine-eventsin Claude Code to confirm it loaded.
Bundled filesreference.md
Details
From the project READMEDoctrine Events (Symfony)
Use when
- You need side effects on entity persistence (timestamps, slugs, search indexing, notifications).
- Migrating an
EventSubscriberInterfaceDoctrine subscriber to ORM 3. - Choosing between lifecycle callbacks, entity listeners, and global lifecycle listeners.
Default workflow
- Pick the narrowest mechanism: callback (one entity, no deps) → entity listener (one entity, needs services) → lifecycle listener (cross-cutting, all entities).
- Wire it with attributes (
#[ORM\HasLifecycleCallbacks],#[AsEntityListener],#[AsDoctrineListener]). - Type the event argument by its per-event class (
PostPersistEventArgs,PreUpdateEventArgs, …). - Verify the side effect fires with a targeted functional test against a real DB.
Guardrails
- ORM 3.0 removed
EventSubscriberInterfaceDoctrine subscribers — never reintroduce them. - Type-check the entity early in a global lifecycle listener (it fires for every entity).
- Never call
flush()inside a Doctrine event handler — it corrupts the in-flight unit of work. preUpdateis restricted: change fields only via$args->setNewValue(), never touch associations.
Progressive disclosure
- Use this file for execution posture and risk controls.
- Open
reference.mdfor the three mechanisms, the event-args matrix, and migration from subscribers.
Output contract
- Listener/callback class with the correct attribute.
- Justification for the chosen mechanism.
- Validation outcomes (test that the side effect fired).
References
reference.md
Comments
Markdown supported