Maîtriser vos données avec un DTO !

Publié le 21 février 2022 par William Suppo
Couverture de l'article 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 :

On passe maintenant à la déclaration de notre entité Car :

1use Spatie\DataTransferObject\DataTransferObject;
2 
3class Car extends DataTransferObject
4{
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 DataTransferObject
4{
5 public string $name;
6}

On l’ajoute ensuite en propriété de la classe Car :

1use Spatie\DataTransferObject\DataTransferObject;
2 
3class Car extends DataTransferObject
4{
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 !

William Suppo avatar
William Suppo
Je mange du PHP au p'tit dej', et vous ?

A lire

Autres articles de la même catégorie