Bibliothèque GraphQL PHP : webonyx/graphql-php et Lighthouse
GraphQL est un langage de requête pour les API qui permet aux clients de demander uniquement les données nécessaires. Dans l'écosystème PHP, la bibliothèque principale pour implémenter GraphQL est webonyx/graphql-php. Elle fournit un ensemble complet d'outils pour créer des schémas, des types et des résolveurs. Pour le framework Laravel, il existe le package Lighthouse, qui étend les capacités de graphql-php et simplifie le développement.
Installation de webonyx/graphql-php
L'installation se fait via Composer :
composer require webonyx/graphql-phpCréation du schéma et des types
La base de GraphQL est le schéma, qui définit les types de données et leurs relations. Voici un exemple de création d'un schéma simple pour obtenir une liste d'utilisateurs.
<?phpuse GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema;use GraphQL\\GraphQL;
// Définition du type User$userType = new ObjectType([ 'name' => 'User', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'email' => Type::string(), ]]);
// Définition du type Query (type racine pour les requêtes)$queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'user' => [ 'type' => $userType, 'args' => [ 'id' => Type::nonNull(Type::int()) ], 'resolve' => function ($root, $args) { // Exemple de données - dans un projet réel, ce serait une requête à la base de données $users = [ 1 => ['id' => 1, 'name' => 'Ivan', 'email' => 'ivan@example.com'], 2 => ['id' => 2, 'name' => 'Maria', 'email' => 'maria@example.com'], ]; return $users[$args['id']] ?? null; } ], 'users' => [ 'type' => Type::listOf($userType), 'resolve' => function () { return [ ['id' => 1, 'name' => 'Ivan', 'email' => 'ivan@example.com'], ['id' => 2, 'name' => 'Maria', 'email' => 'maria@example.com'], ]; } ] ]]);
// Création du schéma$schema = new Schema([ 'query' => $queryType]);
// Exécution de la requête$rawInput = file_get_contents('php://input');$input = json_decode($rawInput, true);$query = $input['query'];$result = GraphQL::executeQuery($schema, $query);$output = $result->toArray();
header('Content-Type: application/json');echo json_encode($output);Travailler avec les mutations
En plus des requêtes (Query), GraphQL prend en charge les mutations (Mutation) pour modifier les données. Exemple de création d'une mutation pour ajouter un utilisateur :
<?php// Définition du type Mutation$mutationType = new ObjectType([ 'name' => 'Mutation', 'fields' => [ 'addUser' => [ 'type' => $userType, 'args' => [ 'name' => Type::nonNull(Type::string()), 'email' => Type::nonNull(Type::string()) ], 'resolve' => function ($root, $args) { // Ici devrait se trouver le code pour sauvegarder dans la base de données return [ 'id' => 3, 'name' => $args['name'], 'email' => $args['email'] ]; } ] ]]);
// Mise à jour du schéma$schema = new Schema([ 'query' => $queryType, 'mutation' => $mutationType]);Utilisation de Lighthouse pour Laravel
Si vous travaillez avec Laravel, il est recommandé d'utiliser Lighthouse. Il automatise la création de schémas basés sur les modèles Eloquent et fournit