Maîtriser vos données avec un DTO !
Analyse du paquet data-transfer-object de Spatie qui permet, à travers une entité, de rendre notre code plus consistant.
Qu’est ce qu’un DTO ?
Comme son nom l’indique un Data Transfer Object permet la transmission de données à travers un objet. L’intérêt est de bénéficier de la puissance des classes comme le typage fort à la différence d’un tableau ou d’un stdClass beaucoup trop génériques et volatiles.
Le paquet spatie/data-transfer-object étant archivé, nous vous invitons à lire notre nouvel article au sujet de laravel-data
Dans quel cas l’utiliser ?
Le cas le plus commun est d’utiliser un DTO pour abstraire une source de donnée, c’est à dire qu’au sein du pattern Repository on va utiliser notre entité comme moyen de transmission de données avec le reste de notre application.
On peut donc instancier notre DTO soit après avoir récupéré nos données depuis une base ou bien depuis une API.
Mise en pratique
Tout d’abord nous allons procéder à l’installation du paquet spatie/data-transfer-object à l’aide de composer :
1composer require spatie/data-transfer-object
Afin de bénéficier de la puissance du paquet et notamment des annotations, on privilégie la v3 qui impose php:^8.0.
Aparté sur les annotations, voici un article de JoliCode qui introduit très bien le sujet.
Pour la mise en pratique on va imaginer une entité Car qui dispose des informations suivantes :
- un id
- un nom
On passe maintenant à la déclaration de notre entité Car :
1use Spatie\DataTransferObject\DataTransferObject;2 3class Car extends DataTransferObject4{5 public int $id;6 7 public string $name;8}
On poursuit par l’instanciation de ce dernier, il suffit pour cela de donner au constructeur un tableau qui a pour clés les propriétés de notre entité :
1$attributes = [2 'id' => 1,3 'name' => 'Clio',4];5 6$car = new Car($attributes);7 8echo 'Nom de la voiture: ' . $car->name . "\n";
On complexifie légèrement notre entité en lui ajoutant une relation Brand qui sera elle-même une entité définit par une propriété name dont voici la déclaration
1use Spatie\DataTransferObject\DataTransferObject;2 3class Brand extends DataTransferObject4{5 public string $name;6}
On l’ajoute ensuite en propriété de la classe Car :
1use Spatie\DataTransferObject\DataTransferObject;2 3class Car extends DataTransferObject4{5 // ...6 7 public Brand $brand;8}
Voici comment produire l’instanciation de nos entités, toujours avec un tableau d’attributs :
1$attributes = [ 2 'id' => 1, 3 'name' => 'Clio', 4 'brand' => [ 5 'name' => 'Renault', 6 ], 7]; 8 9$car = new Car($attributes);10 11echo 'Nom complet de la voiture: ' . $car->brand->name . ' ' . $car->name . "\n";
Voilà pour l’introduction au paquet DTO de Spatie, éditeur qui met à disposition de la communauté de nombreux autres paquets à découvrir !
A lire
Autres articles de la même catégorie
Utiliser un serveur MCP dans votre Laravel
Le MCP, standard de communication entre les assistants IA et vos données, va nous permettre d'ajouter aux réponses de nos agents IA des données fraîches et pertinentes.
Antoine Benevaut
Type-Safe de A à Z
Unifiez les types entre le backend et le frontend pour réduire les bugs et améliorer la cohérence de votre code
Rémy Guillermic
Prism, le SDK agentique pour Laravel
Derrière son utilisation simple et verbeuse, Prism cache une boite à outil très complète pour l'intégration de vos models IA dans vos applications Laravel
Antoine Benevaut