DTO dans Symfony : un objet pour les données qui entrent

Un DTO, dans Symfony, est une petite classe sans lien avec la base qui décrit et valide des données reçues, d'un JSON d'API comme d'un formulaire.

final readonly class ReservationDemande
{
    public function __construct(
        #[Assert\NotBlank(message: 'Indiquez votre nom.')]
        public string $nom = '',

        #[Assert\Range(min: 1, max: 12)]
        public int $personnes = 0,

        #[Assert\NotNull(message: 'Indiquez le jour de votre venue.')]
        #[Assert\GreaterThanOrEqual('today')]
        public ?\DateTimeImmutable $jour = null,
    ) {
    }
}

La demande n'est pas l'entité : le DTO ne porte que ce que le client a le droit d'envoyer, jamais un id ni une date de création, et ses contraintes valent pour l'entrée, pas pour le stockage. Le contrôleur le reçoit rempli et validé, puis construit lui-même l'entité. Ses valeurs par défaut comptent : un champ absent du JSON prend '' ou 0 et tombe sur une règle avec un message clair. Le piège : promettre un type non nullable sans valeur par défaut. Un champ manquant n'atteint plus la validation, il bloque dès la construction de l'objet, et l'erreur renvoyée parle de type au lieu de dire ce qui manque.

Les exercices font écrire le DTO des réservations envoyées par pigeon magique, reçu par #[MapRequestPayload], puis, dans Symfony 8.2, déclarer un formulaire de contact directement sur son DTO avec #[AsFormType] et #[FormField].

2 exercices font travailler cette notion, en écrivant du code dans le navigateur.

Dans les parcours

Dans la Pratique

Notions voisines

#[MapRequestPayload]Formulaire