Introduction à GraphQL et PHP
GraphQL est un langage de requête pour les API, développé par Facebook, qui permet aux clients de demander uniquement les données dont ils ont réellement besoin. Contrairement à REST, où chaque point de terminaison renvoie une structure de données fixe, GraphQL offre flexibilité et efficacité. Si vous travaillez avec PHP et souhaitez implémenter une API moderne, ce tutoriel est fait pour vous.
Dans ce guide, nous allons créer une API GraphQL simple mais fonctionnelle en utilisant la bibliothèque webonyx/graphql-php. Vous apprendrez à installer les dépendances, définir le schéma, les types, les résolveurs et traiter les requêtes. Les exemples de code vous aideront à démarrer rapidement.
1. Préparation de l'environnement et installation des dépendances
Pour commencer, assurez-vous d'avoir installé PHP version 7.4 ou supérieure et Composer, le gestionnaire de dépendances pour PHP. Si Composer n'est pas encore installé, téléchargez-le depuis le site officiel.
Créez un nouveau projet et installez la bibliothèque webonyx/graphql-php :
mkdir graphql-php-tutorialcd graphql-php-tutorialcomposer init --name="myapp/graphql-demo" --type="project" --no-interactioncomposer require webonyx/graphql-phpAprès l'installation, le dossier du projet contiendra le répertoire vendor et le fichier composer.json. Créez également un fichier index.php — tout notre code y sera placé.
En complément, pour faciliter la gestion des requêtes HTTP, installez laminas/laminas-diactoros (une implémentation PSR-7 populaire) et laminas/laminas-httphandlerrunner :
composer require laminas/laminas-diactoroscomposer require laminas/laminas-httphandlerrunner2. Définition du schéma et des types GraphQL
Le cœur de toute API GraphQL est le schéma (schema). Il décrit quelles données sont disponibles et comment les demander. Dans notre exemple, nous allons créer un modèle simple "Utilisateur" (User) et "Publication" (Post).
Définissons d'abord les types à l'aide de la classe GraphQL\\Type\\Definition\\ObjectType. Créez un fichier schema.php (ou ajoutez le code directement dans index.php).
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use 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', 'description' => 'Représente un utilisateur du système', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'email' => Type::string(), ]]);
// Définition du type Post$postType = new ObjectType([ 'name' => 'Post', 'description' => 'Publication d\'un utilisateur', 'fields' => [ 'id' => Type::int(), 'title' => Type::string(), 'content' => Type::string(), 'author' => $userType, // Relation avec l'utilisateur ]]);Remarque : nous utilisons Type::int() et Type::string() — ce sont les types scalaires intégrés de GraphQL. Le champ author fait référence à un autre type d'objet, ce qui permet de construire des requêtes imbriquées.
3. Création des résolveurs et des données fictives
Les résolveurs (resolvers) sont des fonctions qui renvoient les données pour chaque champ. Dans le cas le plus simple, nous pouvons utiliser des données fictives (tableaux).
Ajoutons des résolveurs pour le type racine Query. C'est par lui que les clients obtiendront les données.
// Données fictives$users = [ 1 => ['id' => 1, 'name' => 'Ivan Petrov', 'email' => 'ivan@example.com'], 2 => ['id' => 2, 'name' => 'Maria Smirnova', 'email' => 'maria@example.com'],];
$posts = [ 1 => ['id' => 1, 'title' => 'Première publication', 'content' => 'Texte de la première publication', 'author_id' => 1],