GraphQL API avec PHP : tutoriel pratique étape par étape
GraphQL est un langage de requêtes pour API qui permet aux clients d'obtenir uniquement les données dont ils ont réellement besoin. Contrairement à REST, où chaque endpoint renvoie une structure fixe, GraphQL offre flexibilité et efficacité. Dans ce tutoriel, nous allons créer une API GraphQL complète en PHP à partir de zéro — de l'installation des bibliothèques au traitement des requêtes et des mutations.
Pourquoi GraphQL et PHP forment-ils une excellente paire ?
PHP reste l'un des langages les plus populaires pour le développement côté serveur. Avec la bibliothèque webonyx/graphql-php, vous pouvez facilement intégrer GraphQL dans n'importe quel projet — d'un simple blog à un CRM complexe. Les principaux avantages :
- Flexibilité des requêtes — le client décide lui-même quels champs obtenir.
- Point d'entrée unique — au lieu de multiples endpoints, un seul
/graphql. - Typage strict — le schéma définit tous les types et relations.
- Pratique pour le frontend — React, Vue et autres frameworks fonctionnent facilement avec GraphQL.
Implémentation étape par étape d'une API GraphQL en PHP
1. Installation et configuration de l'environnement
Pour commencer, créons un nouveau projet et installons la bibliothèque principale via Composer :
composer require webonyx/graphql-phpNous aurons également besoin d'un gestionnaire HTTP compatible PSR-7. Utilisons guzzlehttp/psr7 et nyholm/psr7-server :
composer require guzzlehttp/psr7 nyholm/psr7-serverCréons la structure de dossiers de base :
project/├── src/│ ├── Schema/│ ├── Resolvers/│ └── Types/├── public/│ └── index.php├── vendor/└── composer.json2. Définition du schéma GraphQL
Le schéma est le cœur de l'API GraphQL. Il décrit les types de données et les opérations disponibles. Créons le fichier src/Schema/Schema.php :
<?phpnamespace App\\Schema;
use GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema as GraphQLSchema;
class Schema{ public static function build(): GraphQLSchema { // Type "User" $userType = new ObjectType([ 'name' => 'User', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'email' => Type::string(), ] ]);
// Type "Query" — requête racine $queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'user' => [ 'type' => $userType, 'args' => [ 'id' => Type::nonNull(Type::int()) ], 'resolve' => function ($root, $args) { // Ici se trouvera le résolveur return UserResolver::getUser($args['id']); } ], 'users' => [ 'type' => Type::listOf($userType), 'resolve' => function () { return UserResolver::getAllUsers(); } ] ] ]);
// Type "Mutation" — mutation racine $mutationType = new ObjectType([ 'name' => 'Mutation', 'fields' => [ 'createUser' => [ 'type' => $userType, 'args' => [ 'name' => Type::nonNull(Type::string()), 'email' => Type::nonNull(Type::string()) ], 'resolve' => function ($root, $args) { return UserResolver::createUser($args['name'], $args['email']); } ] ] ]);
return new GraphQLSchema([