L’idée de ce billet sur l’installation d’API Platform sur un projet Symfony 3.4 m’est venue lors de la réalisation d’une conférence avec l’association Ardèch’Drôm Dev sur ce même sujet.
La vidéo est disponible sur le lien suivant : Conférence API Platform
Tout est parti d’une idée simple: comment puis-je mettre en place une API Rest avancée sur une projet Symfony 3.4 déjà réalisé ? Trois solutions sont alors disponibles :
- À la mano : Controller et JsonResponse
- Avec FOSRestBundle (https://github.com/FriendsOfSymfony/FOSRestBundle) & JMSSerializerBundle (https://jmsyst.com/bundles/JMSSerializerBundle)
- Avec API Platform (https://api-platform.com/)
- La première, à la mano, ce n’est même pas envisageable ! Trop longue, trop source d’erreur, mais surtout trop longue !
- La seconde: déjà fait. Pas trop mal, assez simple à mettre en place, déjà connue et une très grosse communauté derrière.
- La dernière solution, j’ai eu l’occasion de la découvrir lors d’un déplacement chez un client à Valence où j’y ai rencontré, par le plus grand des hasards, Kévin DUNGLAS. C’est de cette solution dont on va parler aujourd’hui.
Étant donné que je suis un grand amateur de nouvelles solutions, je me suis laissé séduire et j’ai fini par mettre le nez dans la solution. Premier constat : “READ THE F*CKING MANUAL”. Mais What ?! La doc est magnifique, un vrai régal pour les yeux (https://api-platform.com/docs/). Un moteur de recherche simple pour trouver tout ce dont on a besoin. Une version get started sur Docker, super bien réalisée, avec une compatibilité Kubernetes. Bref le décor parfait… Parfait oui, mais pour Symfony 4. Ou un projet vierge.
Impensable pour moi. Mon projet était déjà en place depuis bien longtemps. Une flemmingite aigüe commença à monter en moi. Mais bon, l’envie étant plus forte que tout… Et j’ai pris mon courage à deux mains !
Je me suis mis en quête de mettre ça en place sur tous mes projets personnels et, tant qu’à faire, rédiger un guide d’installation d’Api Platform sur ma stack actuel Symfony 3.4. En avant Guingamp…
Je plante le décor :
Projet e-commerce from scratch maison
- Bundle en place :
- FOSUserBundle
- ApydataGridBundle
- StofDoctrineExtensionsBundle
- NelmioSolariumBundle
- …
Bref rien de transcendant, la stack habituel des familles.
Maintenant, comment je vais rajouter API Platform à tout ça ?
composer require api |
AHHHH la bonne blague ! Je n’ai pas Flex sur mon projet… Mais alors comment faire ? Je ne vous cache pas que j’ai cherché quelques heures et fait un Diff entre un projet vierge de Symfony 3.4 et Symfony 4, je suis tombé sur la conclusion suivante :
Pour ce faire il faut :
- Avoir une version de PHP 7.1 minimum
- Installer
- Api-platform/Core
- Dunglas/Action-Bundle
- Nelmio/Cors-Bundle
Merci Composer !
Ensuite, modification du AppKernel, puis toute la petite configuration qui va bien :
- Configuration globale
Pour expliquer, ce petit bout de configuration sur “sensio_framework_extra” n’est pas lié à API Platform. Cette configuration permet d’injecter mes entités directement à mes controllers sans être obligé d’utiliser l’Annotation @ParamConverter, mais tout est expliqué ici.
- Ajout route/api
Cette configuration a plusieurs intérêts. Le premier c’est de pouvoir diffuser votre API sur l’entrypoint /api mais cela permet également d’exposer, grâce à API Platform, un client WEB Swagger (https://swagger.io/), permettant d’avoir une version documentée de votre API, diffusable ou non 😉.
- Pour ce qui est de la configuration du fichier “app/config/api/api_platform.yml”, je vous invite à consulter le lien suivant : https://api-platform.com/docs/core/configuration, qui explique très bien tout ça.
Et maintenant il n’y a plus qu’à !
Voilà ! On ne s’est pas froissé un muscle et tout est prêt pour développer mon API.
Qu’est ce qu’il me reste à faire maintenant ? Si vous utilisez les annotations, la manip est très simple : il vous suffit d’ajouter l’annotation @ApiResource à la classe de votre entité.
Mais ne soyons pas trop gourmands pour aujourd’hui. Nous verrons dans un prochain article comment implémenter API Platform.