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 ?