logo api platform

API Platform et les DTOs

API Platform est un framework full stack puissant mais facile à utiliser.
Un DTO (Data Transfer Object) est un patron de conception utilisé dans les architectures logicielles objet. Son but est de simplifier les transferts de données entre les sous-systèmes d’une application logicielle. Les objets de transfert de données sont souvent utilisés en conjonction des objets d’accès aux données.

Dans quels cas les utiliser ?

API Platform a une excellente interconnexion avec Doctrine. Si vous utilisez un DTO, vous devrez recoder les paginations, les tris et les filtres.

Mais dans certains cas, pas le choix :

  • Votre modèle de données ne représente pas vos objets métier. Vous n’avez pas à faire supporter la complexité de votre API au consommateur de cette dernière.
  • Votre API fait proxy avec une autre API.

Comment exposer un DTO ?

Il y aura quatre interfaces à implémenter, c’est tout. Ensuite, l’autowiring de symfony fait le reste.

DataProvider

Le DataProvider est là pour récupérer la donnée, c’est à vous de lui indiquer comment.

CollectionDataProviderInterface est à utiliser pour récupérer une collection.
ItemDataProviderInterface est à utiliser pour récupérer un item.
RestrictedDataProviderInterface est à utiliser pour limiter à une ressource ou à un contexte particulier. Par exemple :

<?php
// api/src/DataProvider/BlogPostCollectionDataProvider.php

namespace App\DataProvider;

use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
use App\Entity\BlogPost;

final class BlogPostDataProvider implementsCollectionDataProviderInterface, ItemDataProviderInterface, RestrictedDataProviderInterface
{
    public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
    {
        return BlogPost::class === $resourceClass;
    }

    public function getCollection(string $resourceClass, string $operationName = null): iterable
    {
        // Retrieve the blog post collection from somewhere
        yield new BlogPost(1);
        yield new BlogPost(2);
    }

    public function getItem(string $resourceClass, $id, string $operationName = null, array $context = [])
    {
      return new BlogPost($id);
    }
}

DataPersister

Le DataPersister permet de faire de la persistance de donnée ?

DataPersisterInterface est l’interface à implémenter pour sauvegarder ou supprimer vos informations :

namespace App\DataPersister;

use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
use App\Entity\BlogPost;

final class BlogPostDataPersister implements ContextAwareDataPersisterInterface
{
    public function supports($data, array $context = []): bool
    {
        return $data instanceof BlogPost;
    }

    public function persist($data, array $context = [])
    {
      // call your persistence layer to save $data
      return $data;
    }

    public function remove($data, array $context = [])
    {
      // call your persistence layer to delete $data
    }
}

Félicitations ! Avec 4 interfaces, vous avez exposé votre DTO ?

chevron_left
chevron_right

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Commentaire
Nom
E-mail
Site