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 đ