Maîtriser vos données avec un DTO !

Découverte de paquets
Publié par William

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.

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 :

composer 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 :

use Spatie\DataTransferObject\DataTransferObject;

class Car extends DataTransferObject
{
    public int $id;

    public string $name;
}

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é :

$attributes = [
    'id' => 1,
    'name' => 'Clio',
];

$car = new Car($attributes);

echo '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

use Spatie\DataTransferObject\DataTransferObject;

class Brand extends DataTransferObject
{
    public string $name;
}

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

use Spatie\DataTransferObject\DataTransferObject;

class Car extends DataTransferObject
{
    // ...

    public Brand $brand;
}

Voici comment produire l’instanciation de nos entités, toujours avec un tableau d’attributs :

$attributes = [
    'id' => 1,
    'name' => 'Clio',
    'brand' => [
        'name' => 'Renault',
    ],
];

$car = new Car($attributes);

echo '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 !