controller-cleanup
Installation
SKILL.md
Controller Cleanup (Symfony)
Use when
- A controller action holds business logic, queries, or more than a handful of lines.
- Input parsing, validation, authorization and persistence are mixed in one action.
- A console command does the real work itself instead of delegating it.
Default workflow
- List what the action does: input, validation, authorization, business logic, persistence, side effects.
- Cover the current HTTP behavior with a functional test before moving anything.
- Map input to a DTO with
#[MapRequestPayload]or#[MapQueryString]and let the validator reject it. - Move business logic into a service or a command handler, authorization into a voter, side effects into events or messages.
- Leave the action to resolve, authorize, delegate and respond, in five to ten lines.
Guardrails
- Type-hint services as arguments or constructor parameters; never pull them from the container.
- Keep the HTTP behavior identical: same status codes, same payloads.
- Do not move the logic into a "manager" that is the old controller under a new name.
- Write console entry points as invokable
#[AsCommand]classes (Symfony 7.3+) that delegate to the same services.