Form Types Validation (Symfony)
Use when
- Building or changing a Symfony form type.
- Adding validation constraints on an entity, a DTO, or a form field.
- Different rules per context (registration vs profile) through validation groups.
- Converting values with a data transformer or reacting with form events.
- Writing a custom constraint, or a form spread across several steps.
Default workflow
- Put business constraints on the entity or DTO; keep form-level constraints for UI-only rules such as uploads.
- Build the form type with explicit field types and options.
- Split rules into validation groups when contexts differ.
- Add data transformers or
PRE_SET_DATA/PRE_SUBMIT listeners only where the model and the view disagree.
- In the controller, check
isSubmitted() && isValid() and pass the form itself to render().
Guardrails
- Pass the form, not
createView(), to render() so an invalid submit answers 422.
- A transformer that cannot convert throws
TransformationFailedException, it never returns garbage.
- Do not duplicate the same constraint on the form and on the entity.
- Multi-step flows and the custom violation mapper are recent: verify the installed Symfony version first.
Progressive disclosure
- Use this file for execution posture and risk controls.
- Open references when deep implementation details are needed.
Output contract
- Form types and the constraints they rely on, with their groups.
- Transformers, listeners or custom constraints, each with a reason.
- Tests for a valid submit, an invalid submit (422), and each custom constraint.
References