Les DTO (Data Transfer Objects) dans Symfony sont des objets simples dont le rôle est de transporter des données entre les couches d'une application, notamment entre le contrôleur HTTP et la couche métier. Contrairement aux entités Doctrine, qui gèrent la persistance et la logique métier, les DTO se concentrent uniquement sur la structure des données nécessaires à un cas d'usage spécifique, sans logique ni dépendances. Par exemple, un DTO comme CreateProductInput peut inclure des annotations de validation pour garantir l'intégrité des données avant qu'elles n'atteignent le domaine métier.
L'utilisation des DTO apporte plusieurs avantages, notamment une meilleure sécurité en évitant les attaques par sur-assignation (mass assignment), une séparation claire entre l'API publique et le modèle de persistance, et une validation précoce des données. Ils améliorent également la maintenabilité en documentant explicitement les besoins d'un cas d'usage et en permettant une évolution indépendante des entités et des DTO. Par ailleurs, les DTO favorisent la testabilité, car ils sont faciles à instancier dans des tests unitaires sans dépendre de comportements spécifiques à l'ORM.
Pour une implémentation efficace, les DTO doivent être simples, explicites et immuables, de préférence en utilisant des classes final readonly en PHP 8.2+. Ils peuvent être adaptés à différents besoins, comme les entrées (input) et les sorties (output), qui peuvent avoir des exigences distinctes. En évitant de mélanger les responsabilités des entités et des DTO, les développeurs réduisent les risques de problèmes de sécurité et de couplage serré entre l'API et la base de données.