mcpField
S
symfony:doctrine-events

symfony:doctrine-events

github.com/dev-toolingsDevelopment227147 installsUpdated 4w ago
Repository

About symfony:doctrine-events

A Symfony development skill for handling Doctrine persistence events, including choosing an event mechanism and migrating subscribers to ORM 3. It provides implementation guardrails and calls for targeted functional tests against a real database.

Key features

  1. 01Choose callbacks, entity listeners, or lifecycle listeners
  2. 02Configure listeners with attributes
  3. 03Use event-specific argument types
  4. 04ORM 3 subscriber migration guidance
  5. 05Guardrails for event handlers

Use cases

  1. 01Add timestamps or slugs during persistence
  2. 02Trigger indexing or notifications on persistence
  3. 03Migrate a Doctrine subscriber to ORM 3
  4. 04Test event side effects against a real database

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/dev-toolings/superpowers-symfony --skill symfony:doctrine-events

After installing, type/symfony:doctrine-eventsin Claude Code to confirm it loaded.

Bundled filesreference.md

Details

From the project README

Doctrine Events (Symfony)

Use when

  • You need side effects on entity persistence (timestamps, slugs, search indexing, notifications).
  • Migrating an EventSubscriberInterface Doctrine subscriber to ORM 3.
  • Choosing between lifecycle callbacks, entity listeners, and global lifecycle listeners.

Default workflow

  1. Pick the narrowest mechanism: callback (one entity, no deps) → entity listener (one entity, needs services) → lifecycle listener (cross-cutting, all entities).
  2. Wire it with attributes (#[ORM\HasLifecycleCallbacks], #[AsEntityListener], #[AsDoctrineListener]).
  3. Type the event argument by its per-event class (PostPersistEventArgs, PreUpdateEventArgs, …).
  4. Verify the side effect fires with a targeted functional test against a real DB.

Guardrails

  • ORM 3.0 removed EventSubscriberInterface Doctrine 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.
  • preUpdate is restricted: change fields only via $args->setNewValue(), never touch associations.

Progressive disclosure

  • Use this file for execution posture and risk controls.
  • Open reference.md for 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
  • docs/complexity-tiers.md

Comments

Markdown supported