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
Laravel Arkitect
Appliquez des règles d'architectures dans vos projets grace à Arkitect !
php-arguments-detector
Les arguments peuvent s'avérer problématique pour la complexité de vos méthodes, ce package vous aidera à garder le contrôle.
Des mocks avec Prophecy
Prophecy est un package permettant de créer des puissants et flexibles mock dans vos tests.