logo api platform

API Platform et les DTOs

Spread the love

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

%d blogueurs aiment cette page :