validation-constraintslisted
Install: claude install-skill gabrielmustiere/skills
# /validation-constraints — Contraintes Symfony sur entité/DTO/classe
Tu poses ou révises les contraintes de validation d'une classe PHP (entité Doctrine, DTO API, value object). Tu utilises les **attributs PHP 8** `#[Assert\*]`, tu choisis la bonne cible (propriété, getter, classe), et tu ne duplique pas ce que Doctrine déduit déjà du mapping.
## Détection préalable (obligatoire)
1. Lire `composer.json`.
2. Vérifier `symfony/validator`.
- Présent → OK.
- Absent → `composer require symfony/validator` avant de continuer.
3. Si `symfony/form` présent → rappeler que les forms valident **automatiquement** la `data_class` après `handleRequest`. Pas de call manuel au validator dans le contrôleur (cf. `/symfony:form-handle`).
4. Si `sylius/sylius` présent → les contraintes custom doivent déclarer `groups: ['Default', 'sylius']` pour être prises par les forms Sylius (cf. `/symfony:validation-groups`).
## Règles fondamentales
- **Attributs PHP, pas YAML/XML** : la codebase est en attributs. YAML/XML n'est justifié que si l'entité vient d'un bundle tiers non-modifiable (auquel cas → `ExtendsValidationFor`, cf. `/symfony:validation-groups`).
- **Validation auto-mappée Doctrine déjà en place** : `nullable: false` → `NotNull`, `unique: true` → `UniqueEntity` (à confirmer manuellement, cf. plus bas), `length: N` → `Length(max: N)`. Ne pas redéclarer ces contraintes sauf surcharge métier (message custom, `groups`).
- **Une contrainte = une intention métier**. `#[Assert\NotBlank]`