Skip to content
Development
Skill

/doctrine-events

React to Doctrine entity lifecycle in Symfony with attribute listeners (#[AsDoctrineListener]/#[AsEntityListener], ORM 3) and lifecycle callbacks

From plugin
dev-toolings-superpowers-symfony
18744 skills7 agents13 commands1 hook
Install
$ npx -y skills add dev-toolings/superpowers-symfony --skill doctrine-events --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/doctrine-events

Context preview

The summary Claude sees to decide when to auto-load this skill.

React to Doctrine entity lifecycle in Symfony with attribute listeners (#[AsDoctrineListener]/#[AsEntityListener], ORM 3) and lifecycle callbacks

SKILL.md

doctrine-events.SKILL.md
name: symfony:doctrine-events
allowed-tools:
  - Read
  - Write
  - Edit
  - Bash
  - Glob
  - Grep
description: React to Doctrine entity lifecycle in Symfony with attribute listeners (#[AsDoctrineListener]/#[AsEntityListener], ORM 3) and lifecycle callbacks

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`
Read more
Ships withdev-toolings-superpowers-symfony

Symfony AI development superpowers for Claude Code. 44 expert skills, 7 specialized subagents, and 13 slash commands covering API Platform v4, Doctrine ORM 3, TDD with Pest & PHPUnit, Symfony Messenger, security/voters, and DDD / hexagonal architecture.

Get the whole plugin