Bibliothèque GraphQL PHP : webonyx/graphql-php
GraphQL est un langage de requête moderne pour les API, développé par Facebook. En PHP, l'une des bibliothèques les plus populaires et matures pour implémenter GraphQL est webonyx/graphql-php. Cette bibliothèque permet aux développeurs de créer des API flexibles, typées et efficaces, qui permettent aux clients de demander uniquement les données nécessaires.
Dans cet article, nous allons voir en détail comment installer, configurer et utiliser webonyx/graphql-php dans votre projet PHP. La bibliothèque implémente entièrement la spécification officielle de GraphQL (Juin 2018) et prend en charge toutes les fonctionnalités modernes : requêtes (queries), mutations (mutations), abonnements (subscriptions), interfaces, unions et bien plus encore.
Installation et configuration
L'installation se fait via Composer. Ouvrez un terminal à la racine de votre projet et exécutez :
composer require webonyx/graphql-phpAprès l'installation, la bibliothèque est prête à être utilisée. Aucune configuration minimale n'est requise — il suffit d'importer les classes nécessaires dans votre fichier PHP.
Composants principaux de la bibliothèque
La bibliothèque se compose de plusieurs composants clés qui interagissent entre eux :
- Schéma (Schema) — définit les types de données et les opérations disponibles (requêtes et mutations).
- Types (Types) — décrivent la structure des données (ObjectType, ScalarType, EnumType, InterfaceType, UnionType, etc.).
- Résolveurs (Resolvers) — fonctions qui renvoient les données pour chaque champ.
- Exécuteur (Executor) — traite la requête entrante et renvoie le résultat.
Création d'un schéma simple
Prenons un exemple de création d'un schéma GraphQL simple pour travailler avec des utilisateurs. Commençons par définir le type User :
<?phpuse GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;
$userType = new ObjectType([ 'name' => 'User', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'email' => Type::string(), 'age' => Type::int(), ],]);Créons maintenant le type racine des requêtes Query, qui renverra une liste d'utilisateurs :
$queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'users' => [ 'type' => Type::listOf($userType), 'resolve' => function ($root, $args) { // Ici, généralement une requête à la base de données return [ ['id' => 1, 'name' => 'Ivan Ivanov', 'email' => 'ivan@example.com', 'age' => 30], ['id' => 2, 'name' => 'Maria Petrova', 'email' => 'maria@example.com', 'age' => 25], ]; }, ], 'user' => [ 'type' => $userType, 'args' => [ 'id' => Type::nonNull(Type::int()), ], 'resolve' => function ($root, $args) { // Recherche d'un utilisateur par ID $users = [ 1 => ['id' => 1, 'name' => 'Ivan Ivanov', 'email' => 'ivan@example.com', 'age' => 30], 2 => ['id' => 2, 'name' => 'Maria Petrova', 'email' => 'maria@example.com', 'age' => 25], ]; return $users[$args['id']] ?? null; }, ], ],]);Regroupement dans un schéma et exécution d'une requête
Regroupons maintenant le tout dans un schéma unique et exécutons une requête de test :
use GraphQL\\GraphQL;use GraphQL\\Schema;
$schema = new Schema([ 'query' => $queryType,]);
// Requête GraphQL entrante (généralement envoyée en POST)$query = '{ users { id name em