Comment (bien) supprimer ApiPlatform et utiliser des solutions alternatives ?

Ong Timothée
Reparcar
Published in
4 min readAug 1, 2022

Api Platform est un formidable outil pour concevoir une Api rapidement, répondant à de nombreuses problématiques métier (documentation instantanée, accès à graphQl intégré, customisation …). Néanmoins, le niveau d’abstraction, le relationnel des entités trop décomposées, une utilisation de graphQl limitée nous amène à rechercher une solution qui serait plus optimal pour une application à gros trafic (nécessitant un traitement par lots de données: DataLoader).

Cet article décrit comment “reproduire” le comportement fourni par Api platform avec d’autres solutions.

Pour bien débuter, supprimons Api Platform:

composer remove api

REST Api

Pour recréer les routes REST nous avons besoin de deux bundles: Nelmio & FOSRestBundle.

Nelmio

Commençons par installer le bundle qui permettra de générer une documentation OpenApi (Swagger):

composer require nelmio/api-doc-bundle

Puis il faut indiquer le chemin de notre documentation dans le fichier: config/routes.yaml

NelmioApiDocBundle:
resource: "@NelmioApiDocBundle/Resources/config/routing/swaggerui.xml"
prefix: /path-to-doc

FOS Rest

Installation

Afin de pouvoir créer nos premières routes nous devons installer un “gestionnaire” de requêtes Api RESTful : FOSRestBundle.

composer require friendsofsymfony/rest-bundle

La config nécessaire à son utilisation se trouve dans le fichier “config/packages/fos_rest.yaml”.

Ne pas oublier de rendre le format json valide

Ajoutons également le serializer adéquate:

composer require jms/serializer-bundle

Création d’une Route Rest

C’est bon, vous êtes enfin prêt pour la création de vos routes REST, commençons par une route GET, dans un controller, par exemple GatewayController:

Dans cet exemple, nous récupérons une gateway en fonction de l’id fournis

L’information utile à retenir est d’étendre la class abstraite AbstractFOSRestController qui sert, notamment, à la génération de la View.

Si vous voulez retourner certains champs uniquement vous avez la possibilités de spécifier un groupe de stérilisation au sein même de votre entité comme ceci:

L’attribut “AnnotationGroup” permet une View personnalisé

Nous venons ainsi de reproduire le comportement fournis par Api Platform sur les routes Rest (Paramètres, Group de sérialisation…) L’avantage de cette méthode est de pouvoir customiser notre api directement par l’utilisation des outils fournis par Symfony (extra-framework par exemple).

Rendu de l’exemple ci-dessus

Cependant il nous reste à reproduire le comportement de graphQl. Pour cela nous allons utiliser un bundle prévu à cet effet: GraphQl bundle.

GraphQl/GraphiQl

Installation

Commençons par implémenter GraphQl dans notre application:

composer require webonyx/graphql-php

Ainsi que les paramètres nécessaires se trouvant dans le fichier “config/pakages/graphql.yaml” :

Nous indiquons ici vouloir créer uniquement des Query

Si nous voulons avoir accès à un playground (comme celui d’Api platform), il est nécessaire d’installer GraphiQl (uniquement pour l’environnement de développement).

composer require --dev overblog/graphiql-bundle

Sans oublier de spécifier la route d’accès, indiquée dans le fichier “config/routes/dev/graphiql.yaml”:

Création d’une Query Graphql

Dans un dossier Query, commençons par créer un conteneur de Queries:

Rendre public le container de Query (dans le service.yaml)

Puis écrivons notre première query (faisant la même chose que la route GET au-dessus):

On oublie pas d’ajouter sont accessibilité dans service.yaml:

Et enfin les champs visibles dans notre entité:

Attribut Field permet de voir la propriété dans la réponse

Et c’est fini, vous avez reproduit à l’identique ce qu’Api Platform vous propose à ceci près que les manipulations de classe, d’événement se feront directement avec les librairies de symfony et non des abstractions custom.

Vue du playground GraphiQl

Sources

https://fosrestbundle.readthedocs.io/en/3.x/1-setting_up_the_bundle.html

https://blog.latenightdev.net/why-i-stopped-using-api-platform-c09cb030f76e

https://api-platform.com/

https://github.com/overblog/GraphiQLBundle

https://github.com/graphql/dataloader

--

--