www.ITNetwork.fr

Le Blog > API Platform

— Benoüt Petitcollot

Partager cet article: Twitter LinkedIn

Pourquoi utiliser API Platform ?

CrĂ©er une application web dans les rĂšgles de l’art prend un certain temps. Un coĂ»t qui est notamment liĂ© Ă  la qualitĂ© du code (robuste, maintenable
) et la sĂ©curitĂ© des donnĂ©es, garantis par l’écriture de tests.

Certains de nos clients se sont tournĂ©s vers des solutions nocode pour rĂ©pondre Ă  des besoins internes de gestion de donnĂ©es ou d’automatisation de tĂąches. Ces outils tentent de permettre le dĂ©veloppement d’applications web sans avoir besoin d’apprendre un langage de programmation : il suffit de savoir cliquer, glisser-dĂ©poser et de configurer des actions Ă  travers quelques formulaires et boĂźtes de dialogues pour obtenir rapidement un rĂ©sultat fonctionnel.

AprĂšs une pĂ©riode de tests, nous n’avons pas Ă©tĂ© convaincus par ces outils au delĂ  de certains cas d’utilisation assez simples.

Cependant, nous avions besoin de nous positionner face Ă  la concurrence des outils nocode qui mettent en avant une extrĂȘme rapiditĂ© de mise en place. Nous avons donc plutĂŽt recherchĂ© une solution de Rapid Application Development qui nous permettrait de rĂ©aliser beaucoup plus rapidement un prototype ou une premiĂšre version d’application tout en nous permettant de faire Ă©voluer par la suite le produit vers nos critĂšres de qualitĂ©.

Nous n’avions jamais testĂ© API Platform mais nous Ă©tions Ă  l’écoute de ce qui s’en disait au sein de la communautĂ© PHP. C’était le moment de prendre en main cet outil pour voir s’il pouvait correspondre Ă  notre besoin.

Le projet

Afin de tester API Platform en conditions rĂ©elles, j’ai redĂ©veloppĂ© une petite application dans laquelle nous Ă©valuons le temps passĂ© aux diffĂ©rentes tĂąches que nous exĂ©cutons au jour le jour. C’est une application assez simple mais qui mobilise quelques fondamentaux du dĂ©veloppement web :

  • stockage en base de donnĂ©es assorti d’un CRUD
  • utilisation soumise Ă  authentification
  • interrogation d’une API externe (l’API de Github pour rĂ©cupĂ©rer les intitulĂ©s des issues)
  • un peu d’ergonomie sur les formulaires

Les buts de l’exercice Ă©taient donc les suivants :

  • prendre en main API Platform et les pratiques recommandĂ©es par sa documentation
  • Ă©valuer le temps minimal nĂ©cessaire pour obtenir un outil fonctionnel
  • s’assurer de l’évolutivitĂ© du produit obtenu

Prise en main

Nos habitudes API Platform
Symfony EntiÚrement intégré au framework et utilise de nombreux composants Symfony
ORM Doctrine Intégration de plusieurs couches de persistance dont Doctrine
Command bus avec Tactician Recommande plutît d’utiliser le composant Symfony Messenger
RabbitMQ avec consumer Swarrot Symfony Messenger
Authentification JWT API Platform laisse au développeur le soin de gérer la sécurité
React et NextJS React Admin et plusieurs gĂ©nĂ©rateurs d’applications avec diffĂ©rents frameworks dont NextJS

Avec API Platform, nous sommes donc largement en terrain connu. Certaines spĂ©cificitĂ©s nĂ©cessitent tout de mĂȘme une prise en main :

  • Exit les Controllers Symfony. API Platform propose des attributs PHP pour configurer les ressources d’API et se charge de gĂ©nĂ©rer les routes correspondantes. La logique mĂ©tier doit ĂȘtre embarquĂ©e dans des DataProviders et DataPersisters qui font le lien entre les entitĂ©s Doctrine et les ressources d’API.
  • L’attribut ApiResource expose beaucoup de paramĂštres de configuration pour activer / dĂ©sactiver les actions prĂ©sentes par dĂ©faut sur chaque endpoint, activer des filtres, activer GraphQL, etc.
  • La documentation recommande de ne pas utiliser la mĂȘme classe comme entitĂ© et comme ApiResource. Des DataProviders Doctrine sont cependant implĂ©mentĂ©s pour fonctionner avec des classes entitĂ©-ressource dans une optique de RAD. Il vaut mieux avoir les idĂ©es claires pour faire la part des choses dans les exemples proposĂ©s tout au long de la documentation.
  • API Platform propose un paquet complĂ©mentaire Ă  React Admin pour le faire communiquer avec l’API. Il faut Ă©galement se familiariser avec les concepts de React Admin, les hooks de react-hook-form et la surcouche d’API Platform. Il vaut donc mieux avoir dĂ©jĂ  une comprĂ©hension du fonctionnement de React.

DĂ©veloppement initial

Installation des bibliothĂšques PHP

  • On installe Symfony
$ symfony new timetrackor
$ cd timetrackor
  • On ajoute API Platform
$ composer require api
  • Un bundle pour gĂ©rer l’authentification JWT
$ composer require lexik/jwt-authentication-bundle

Création du modÚle de données

A ce stade, API Plaform est fonctionnel mais il manque des donnĂ©es Ă  exposer. On crĂ©e un User, une classe pour les temps passĂ©s et on lie le mĂ©canisme d’authentification Ă  la classe User.

Voici les fichiers que j’ai eu Ă  crĂ©er / modifier :

 .env                                                |   4 ++--
 config/packages/doctrine.yaml                       |   2 ++
 config/packages/nelmio_cors.yaml                    |   7 +++++++
 config/packages/security.yaml                       |  28 +++++++++++++++++++---------
 config/routes.yaml                                  |   3 +++
 config/services.yaml                                |   9 +++++++++
 migrations/Version20220610070946.php                |  35 +++++++++++++++++++++++++++++++++++
 migrations/Version20220610080031.php                |  36 ++++++++++++++++++++++++++++++++++++
 src/DataPersister/WorkingTimePersister.php          |  35 +++++++++++++++++++++++++++++++++++
 src/DataProvider/WorkingTimeProvider.php            |  10 ++++++++++
 src/Entity/User.php                                 | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Entity/WorkingTime.php                          | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/EventListener/AuthenticationSuccessListener.php |  29 +++++++++++++++++++++++++++++
 src/Repository/UserRepository.php                   |  66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Repository/WorkingTimeRepository.php            |  66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 15 files changed, 569 insertions(+), 11 deletions(-)

Installation de l’admin API Platform

On installe ensuite l’interface d’administration.

$ yarn create react-app my-admin
$ cd my-admin
$ yarn add @api-platform/admin

Personnalisation de l’admin

L’admin est immĂ©diatement fonctionnelle mais il manque la gestion de la logique d’authentification et un peu de personnalisation pour rendre le formulaire de saisie un minimum ergonomique (Formattage de certains champs et connexion Ă  l’API de Github pour rĂ©cupĂ©rer les issues triĂ©es par projets)

 my-admin/src/App.js                          |  92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
 my-admin/src/components/WorkingTimeCreate.js | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 my-admin/src/components/WorkingTimeList.js   |  10 +++++++++
 my-admin/src/github/githubAPIClient.js       |  34 ++++++++++++++++++++++++++++++
 my-admin/src/security/authProvider.js        |  40 ++++++++++++++++++++++++++++++++++++
 5 files changed, 331 insertions(+), 23 deletions(-)

RĂ©sultat

Exception faite du temps de montĂ©e en compĂ©tence, j’ai donc obtenu une premiĂšre version utilisable avec quelques lignes de commande et 900 lignes de code, ce qui doit ĂȘtre rĂ©alisable en une journĂ©e de travail.

J’ai ensuite pris le temps d’écrire quelques tests pour vĂ©rifier le fonctionnement de certains aspects qui n’étaient pas couverts par ce petit projet de test :

  • La finesse des droits d’accĂšs aux donnĂ©es par utilisateur
  • La gestion des sous-ressources
  • Les champs calculĂ©s
  • Les filtres avec ou sans paramĂštres
  • Le support GraphQL

J’ai assez facilement trouvĂ© rĂ©ponse Ă  mes questions dans la documentation et je n’ai pas trouvĂ© de point bloquant ou excessivement compliquĂ© Ă  rĂ©soudre.

Conclusion

Au final, la prise en main nĂ©cessite certes d’ĂȘtre familier de l’écosystĂšme Symfony et de React. Quelques jours sont nĂ©cessaires pour assimiler les concepts et les fonctionnements spĂ©cifiques d’API Platform.

Pour autant, je n’ai pas eu le sentiment d’ĂȘtre prisonnier des choix de la bibliothĂšque. Les services prĂ©sents de base peuvent ĂȘtre dĂ©corĂ©s ou tout simplement remplacĂ©s ce qui assure de pouvoir personnaliser Ă  l’envie le fonctionnement de l’API.

En dehors de l’authentification, il n’y a quasiment rien Ă  Ă©crire soi-mĂȘme pour obtenir un rĂ©sultat fonctionnel. Des DataProviders sont disponibles pour Doctrine mais aussi MongoDB et ElasticSearch. De nombreux filtres sont Ă©galement implĂ©mentĂ©s en tant que services. Les principaux formats d’échange sont supportĂ©s (JSON-LD, JSON:API
).

C’est donc une expĂ©rience encourageante. Il est fort probable que nous utilisions API Platform pour l’un de nos futurs projets.