Bibliothèque GraphQL PHP : webonyx/graphql-php
Dans le développement web moderne, le besoin d'API flexibles et efficaces se fait de plus en plus sentir. Les services REST traditionnels souffrent souvent d'un chargement de données excessif ou insuffisant. GraphQL est un langage de requête et un environnement d'exécution créé par Facebook, qui permet aux clients de demander exactement les données dont ils ont besoin. Pour PHP, l'une des implémentations les plus populaires est la bibliothèque webonyx/graphql-php.
Cette bibliothèque fournit un ensemble complet d'outils pour construire des serveurs GraphQL en PHP : de la définition du schéma de types au traitement de requêtes complexes avec des relations imbriquées. Elle est idéale pour créer des API modernes pour les applications web, les applications mobiles et les SPA (Single Page Applications).
Fonctionnalités principales de webonyx/graphql-php
- Prise en charge complète de la spécification GraphQL (juin 2018) — tous les types, directives, variables et fragments.
- Système de types basé sur des objets PHP — définition de types, interfaces, types union et enum.
- Résolveurs intégrés — possibilité de définir la logique de récupération des données pour chaque champ.
- Validation des requêtes — vérification automatique de la syntaxe et des types.
- Prise en charge du chargement paresseux — les données sont chargées uniquement sur demande.
- Compatibilité avec les frameworks populaires — Laravel, Symfony, Yii2 via des packages d'encapsulation.
Installation et configuration
L'installation se fait via Composer :
composer require webonyx/graphql-phpPour fonctionner, PHP 7.1+ avec l'extension mbstring est requis. Après l'installation, créons un serveur simple.
Exemple : création d'un schéma GraphQL
Considérons un exemple de base — récupération d'une liste de livres et d'auteurs. Commençons par définir les types :
<?phpuse GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema;
// Type "Author"$authorType = new ObjectType([ 'name' => 'Author', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'books' => [ 'type' => Type::listOf($bookType), // sera défini ci-dessous 'resolve' => function ($author) { // Supposons qu'il existe une fonction getBooksByAuthorId() return getBooksByAuthorId($author['id']); } ] ]]);
// Type "Book" (défini avec une fermeture pour les références cycliques)$bookType = new ObjectType([ 'name' => 'Book', 'fields' => function() use ($authorType) { return [ 'id' => Type::int(), 'title' => Type::string(), 'author' => [ 'type' => $authorType, 'resolve' => function ($book) { return getAuthorById($book['author_id']); } ] ]; }]);
// Type "Query"$queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'books' => [ 'type' => Type::listOf($bookType), 'resolve' => function() { return getAllBooks(); } ], 'author' => [ 'type' => $authorType, 'args' => [ 'id' => Type::nonNull(Type::int()) ], 'resolve' => function($root, $args) { return getAuthorById($args['id']); } ] ]]);
// Création du schéma$schema = new Schema([ 'query' => $queryType]);Traitement de la requête
Écrivons maintenant le code qui reçoit une requête GraphQL et renvoie le résultat :
<?phpuse GraphQL\\GraphQL;use GraphQL\\Error\\DebugFlag;
// Récupération du corps de la requête depuis l'entrée