Nehos Groupe

API Platform : générer une API REST complete avec Symfony en quelques heures

OpenAPI auto-doc, serialization groups, pagination, filters, GraphQL, JWT auth et tests Behat : tout ce qu'il faut pour livrer une API de production.

Nos clients types

Scale-up
PME
ETI
Grand Groupe

L'essentiel

API Platform est le framework de référence pour construire des API REST et GraphQL avec Symfony. Il génère automatiquement la documentation OpenAPI, gere la pagination, le filtrage, la serialization et le content negotiation à partir de vos entités Doctrine.

En version 4.x, API Platform adopte une architecture basée sur des classes ApiResource PHP 8 attributes, ce qui simplifie la configuration et renforce le typage statique. Une API CRUD complete avec documentation interactive se genere en moins de 30 minutes.

Pour passer en production, il faut ajouter l'authentification JWT (LexikJWTAuthenticationBundle), le rate limiting (Symfony RateLimiter), les serialization groups pour contrôler les données exposées et une suite de tests Behat pour valider les contrats d'API.

S
Souhail Tourjmen
··9 min de lecture·development

Construire une API REST de A a Z avec Symfony sans API Platform demande des semaines : routing, serialization, validation, pagination, documentation, gestion des erreurs, content negotiation. API Platform compresse tout ce travail en quelques heures. Ce framework open-source, cree par Kevin Dunglas et maintenu par une communauté active, est devenu le standard de facto pour les API PHP en entreprise. Chez Nehos, nous l'utilisons sur la majorité de nos projets B2B depuis 2019, de l'API interne d'un ERP logistique a la plateforme SaaS d'un éditeur fintech. Voici un guide technique complet pour construire, sécuriser et tester une API REST de production avec API Platform 4.x et Symfony 7.

#Pourquoi API Platform plutôt qu'une API Symfony maison ?

La question merite d'être posée. Symfony fournit nativement tous les composants pour construire une API : le composant Serializer pour transformer les objets en JSON, le composant Validator pour valider les données entrantes, le composant Routing pour définir les endpoints et le composant Security pour gérer l'authentification. Alors pourquoi ajouter une couche supplémentaire ? La réponse tient en trois mots : productivité, standardisation et maintenabilite. API Platform elimine le code boilerplate en générant automatiquement les endpoints CRUD (GET collection, GET item, POST, PUT, PATCH, DELETE) à partir de vos entités Doctrine. Il produit une documentation OpenAPI 3.1 interactive (Swagger UI) sans aucune configuration. Il gère nativement la pagination, le filtrage, le tri et le content negotiation (JSON, JSON-LD, HAL, CSV). Il impose des conventions qui rendent le code prévisible pour n'importe quel développeur qui rejoint le projet. Sur un projet typique avec 15 a 20 entités, API Platform economise 3 a 4 semaines de développement par rapport à une API Symfony faite à la main. C'est un gain que nos clients ETI mesurent directement sur leurs budgets de développement.

#Installation et configuration initiale d'API Platform 4.x

L'installation d'API Platform sur un projet Symfony 7 existant se fait via Composer et Symfony Flex. La commande composer require api installe le bundle principal et configure automatiquement les fichiers nécessaires grace aux recipes Flex. Après installation, la configuration de base se trouve dans config/packages/api_platform.yaml ou vous pouvez définir le titre de l'API, la description, la version et les formats de serialization supportes. Le point d'entrée par défaut est /api, configurable dans le fichier de routes. Pour exposer une entité comme ressource API, il suffit d'ajouter l'attribut PHP 8 ApiResource sur la classe. L'attribut accepte des parametres pour personnaliser les opérations disponibles, les groupes de serialization, les filtres et les règles de validation. Avec Symfony Flex, un projet API Platform minimal est opérationnel en moins de 10 minutes : l'installation configure le routing, le serializer, la documentation OpenAPI et le panneau d'administration. La documentation interactive Swagger UI est immédiatement accessible a l'URL /api et liste toutes les ressources exposées avec leurs operations, leurs parametres et leurs schemas de données.

#Serialization groups : contrôler les données exposées

La serialization est le mécanisme qui determine quelles propriétés d'une entité sont incluses dans la réponse JSON. Sans controle, API Platform expose toutes les propriétés de l'entité, y compris celles que vous ne voulez pas rendre publiques (hash de mot de passe, identifiants internes, relations sensibles). Les serialization groups resolvent ce problème en permettant de définir quels champs sont inclus dans quel contexte. Vous définissez des groupes avec l'attribut Groups du composant Serializer sur chaque propriété, puis vous spécifiez dans l'attribut ApiResource quels groupes sont utilises pour la lecture (normalization) et l'écriture (denormalization). Par exemple, un groupe read expose le nom, le prénom et l'email d'un utilisateur en lecture, tandis qu'un groupe write autorise la modification du nom et du prénom mais pas de l'email. Un groupe admin expose des champs supplémentaires (date de création, role, dernière connexion) visibles uniquement pour les administrateurs. Cette granularite est essentielle pour les API B2B ou différents partenaires ont des niveaux d'accès différents aux données. Chez Nehos, nous définissons systématiquement au minimum trois groupes de serialization par entité : read pour la lecture publique, write pour l'écriture, admin pour l'administration interne. Cette convention facilite la maintenance et l'onboarding des nouveaux développeurs sur le projet.

#Pagination, filtres et tri : les données a la carte

API Platform integre nativement la pagination, le filtrage et le tri des collections sans aucun code supplémentaire. La pagination est activée par défaut avec 30 elements par page et utilise le format Hydra (JSON-LD) pour fournir les liens de navigation (premiere page, page suivante, dernière page, nombre total d'éléments). Le client peut ajuster le nombre d'éléments par page via le parametre itemsPerPage dans la query string. Les filtres sont la fonctionnalité qui differencie API Platform d'une API basique. Vous pouvez ajouter des filtres de recherche (SearchFilter pour les correspondances exactes, partielles ou par préfixe), des filtres de plage (RangeFilter pour les dates, les montants), des filtres booléens (BooleanFilter) et des filtres d'existence (ExistsFilter pour verifier si une relation existe). Chaque filtre se configure via un attribut ApiFilter sur l'entité ou via la configuration YAML. Le tri est géré par OrderFilter qui permet au client de trier les résultats sur n'importe quelle propriété autorisée via le parametre order dans la query string. Tous ces filtres sont automatiquement documentes dans la specification OpenAPI, ce qui signifie que le frontend developer ou le partenaire API peut les découvrir dans Swagger UI sans lire la documentation technique. C'est un gain de productivité considerable pour les equipes qui consomment l'API.

→ Pour aller plus loin : découvrez nos outils gratuits — calculateurs ROI, diagnostics techniques et quiz interactifs pour affiner votre réflexion.

#GraphQL avec API Platform : une alternative au REST

API Platform supporte nativement GraphQL en plus de REST, sans duplication de code. L'activation se fait via le package api-platform/graphql et la configuration ajoute automatiquement un endpoint /api/graphql avec un playground interactif GraphiQL. Les avantages de GraphQL pour les API B2B sont significatifs. Le client peut demander exactement les champs dont il a besoin, éliminant le problème de sur-fetching (recevoir plus de données que nécessaire) et de sous-fetching (devoir faire plusieurs requêtes pour obtenir les données liées). Les mutations GraphQL remplacent les verbes HTTP pour la création et la modification. Les subscriptions permettent des notifications en temps réel. En pratique, nous recommandons GraphQL pour les cas d'utilisation ou le frontend est complexe et necessite des requêtes flexibles (dashboards avec de nombreux widgets, applications mobile qui doivent économiser la bande passante). Pour les API d'intégration B2B avec des partenaires, REST reste souvent preferable car il est plus largement compris et ne necessite pas de client spécifique. API Platform permet de supporter les deux protocoles simultanément sur les mêmes entités, ce qui offre une flexibilité maximale sans duplication de code ni de logique métier.

→ Pour aller plus loin : découvrez nos outils gratuits — calculateurs ROI, diagnostics techniques et quiz interactifs pour affiner votre réflexion.

#Authentification JWT et sécurité de l'API

Une API de production necessite une authentification robuste. API Platform s'integre parfaitement avec le composant Security de Symfony et le bundle LexikJWTAuthenticationBundle pour l'authentification par token JWT. Le flux d'authentification est le suivant : le client envoie ses identifiants (email et mot de passe) a un endpoint /api/login_check, le serveur verifie les identifiants et retourne un token JWT signe, le client inclut ce token dans le header Authorization de chaque requête subséquente. La configuration comprend la génération d'une paire de clés RSA pour signer les tokens, la configuration du TTL (time-to-live) du token (généralement 1 heure pour le access token et 30 jours pour le refresh token) et la définition des règles d'accès par opération dans le security de Symfony. Au-delà du JWT, une API de production doit implementer le rate limiting pour prévenir les abus. Symfony 7 integre un composant RateLimiter natif qui permet de définir des limites par IP, par utilisateur ou par endpoint. Nous recommandons les limites suivantes pour une API B2B : 100 requêtes par minute par utilisateur pour les endpoints de lecture, 20 requêtes par minute pour les endpoints d'écriture, 5 tentatives par minute pour l'endpoint de login. Ces limites protègent l'API contre les attaques par force brute et les clients mal configures qui envoient des requêtes en boucle.

#Doctrine ORM : optimiser les requêtes pour la performance

API Platform repose sur Doctrine ORM pour l'accès aux données. Cette integration est puissante mais peut générer des problèmes de performance si les relations entre entités ne sont pas correctement gérées. Le problème le plus frequent est le N+1 queries : pour une collection de 30 elements avec une relation, Doctrine execute 1 requête pour la collection puis 30 requêtes supplémentaires pour charger chaque relation. La solution est d'utiliser les eager loading extensions d'API Platform ou de définir des custom data providers qui utilisent des jointures optimisées. Nous recommandons de toujours activer le Symfony Profiler en développement et de surveiller le panneau Doctrine pour detecter les N+1 queries. Chaque endpoint de collection doit être teste avec un volume réaliste de données (1 000 a 10 000 elements) pour valider les performances avant la mise en production. Les autres optimisations essentielles comprennent l'utilisation de DTOs (Data Transfer Objects) pour les endpoints complexes qui ne correspondent pas directement a une entité, la mise en cache HTTP avec les headers Cache-Control et ETag pour les ressources qui changent rarement et l'utilisation de Varnish ou Symfony HTTP Cache en reverse proxy pour absorber la charge sur les endpoints les plus sollicites.

#Tests Behat : valider les contrats d'API

Une API sans tests est une API qui casse en silence. Behat, combine avec le contexte API Platform, permet d'écrire des tests fonctionnels en langage naturel qui valident le comportement de chaque endpoint. Un scenario Behat typique pour un endpoint de création ressemble a ceci : étant donne que je suis authentifie en tant qu'administrateur, quand j'envoie une requête POST vers /api/products avec un body JSON contenant les champs requis, alors le code de réponse doit être 201, et la réponse doit contenir le champ id, et le produit doit exister en base de données. Les tests Behat couvrent plusieurs dimensions : la validation des codes HTTP pour chaque operation (200, 201, 204, 400, 401, 403, 404), la validation du schema de réponse (champs presents, types corrects), la validation des règles de sécurité (un utilisateur non authentifie reçoit un 401, un utilisateur sans permission reçoit un 403), la validation de la pagination (nombre d'éléments, liens de navigation) et la validation des filtres (les résultats filtres correspondent aux critères). Chez Nehos, chaque endpoint API est couvert par au minimum 5 scenarios Behat : le cas nominal (happy path), les cas d'erreur de validation (champs manquants, types incorrects), les cas de sécurité (accès non autorise) et les cas limites (collection vide, element inexistant). Cette couverture de tests est incluse dans nos prestations de développement et maintenue dans le cadre de la TMA.

#Conclusion : API Platform, le standard pour les API PHP d'entreprise

API Platform transforme la construction d'API PHP d'un exercice d'artisanat en un processus industrialise. La documentation automatique, la serialization configurable, la pagination et le filtrage natifs, le support GraphQL et l'intégration Symfony native en font un outil indispensable pour toute equipe PHP qui construit des API de production. Le temps economise sur le boilerplate est réinvesti dans la logique métier, la sécurité et les tests. C'est exactement l'approche que nous appliquons chez Nehos sur chaque projet API B2B.

Questions & Réponses

Questions frequentes : API Platform et Symfony

Oui, à condition d'optimiser les requêtes Doctrine et de mettre en place une stratégie de cache. API Platform gere nativement la pagination côté serveur, ce qui evite de charger des millions d'enregistrements en mémoire. Pour les très gros volumes (plus de 100 000 elements dans une collection), nous recommandons d'utiliser des cursor-based pagination au lieu de la pagination par offset, de mettre en place un cache HTTP avec Varnish pour les endpoints de lecture et d'utiliser des index de base de données optimises pour les filtres les plus utilises. Sur un projet Nehos pour un éditeur SaaS, nous gérons une API avec 2 millions d'enregistrements et des temps de réponse inférieurs a 200ms grâce à ces optimisations.

Oui. API Platform est conçu pour être decouple de Doctrine grace au système de State Providers et State Processors. Un State Provider définit comment les données sont lues (depuis Elasticsearch, un service externe, un fichier CSV, ou tout autre source) et un State Processor définit comment elles sont persistees. Vous pouvez ainsi exposer des ressources API qui ne sont pas des entités Doctrine : des données agrégées depuis plusieurs sources, des résultats de calculs complexes ou des données provenant d'API tierces. Cette architecture est particulièrement utile pour les API de féderation qui agrègent des données de plusieurs microservices.

API Platform supporte plusieurs strategies de versioning. La plus courante est le versioning par header (Accept: application/vnd.api+json;version=2) qui permet de faire cohabiter plusieurs versions de la même ressource sans changer l'URL. L'alternative est le versioning par URL (/api/v1/products, /api/v2/products) qui est plus simple a comprendre pour les consommateurs de l'API mais plus difficile a maintenir côté serveur. Notre recommandation chez Nehos est d'éviter le versioning tant que possible en utilisant une stratégie d'évolution additive : ajouter de nouveaux champs sans supprimer les anciens, utiliser les serialization groups pour contrôler la visibilité des champs par client et déprécier progressivement les champs obsoletes avec des headers Warning.

Les deux sont des choix valides mais pour des contextes différents. API Platform excelle dans les projets ou l'API est le produit principal : APIs B2B complexes avec de nombreuses entités, plateformes SaaS, applications headless. Sa documentation automatique, ses filtres natifs et son support GraphQL en font un gain de productivité majeur sur ces projets. Laravel avec Sanctum est plus adapte aux APIs simples qui servent un frontend SPA ou une application mobile, ou la rapidité de mise en place prime sur la richesse fonctionnelle. Si votre equipe maitrise Symfony et que l'API comporte plus de 10 entités avec des relations complexes, API Platform est le choix rationnel. Si votre equipe est sur Laravel et que l'API est un composant secondaire d'une application web classique, restez sur Laravel.

Réserver un audit