Introduction : Pourquoi GraphQL et PHP forment une excellente paire
Dans le monde du développement web, l'API REST a longtemps été le standard de facto. Cependant, avec la complexité croissante des applications et l'émergence des clients mobiles, les inconvénients de REST sont devenus évidents : excès ou manque de données, multiples points de terminaison, versioning complexe. GraphQL, développé par Facebook, résout ces problèmes en permettant au client de demander uniquement les données dont il a besoin et de les obtenir en une seule requête.
PHP, malgré son côté « vieille école », reste un langage puissant pour créer la logique serveur. Grâce à des bibliothèques modernes comme webonyx/graphql-php, implémenter une API GraphQL en PHP est devenu simple et efficace. Dans ce tutoriel, nous allons créer pas à pas un serveur GraphQL complet capable de traiter des requêtes, des mutations et de fonctionner avec une base de données.
Nous utiliserons PHP 8.0+, Composer pour la gestion des dépendances et le serveur PHP intégré pour les tests locaux. À la fin de cet article, vous serez en mesure de déployer votre propre API et de l'intégrer avec n'importe quel frontend.
1. Installation et configuration de l'environnement
Avant d'écrire du code, il est nécessaire de préparer le projet. Assurez-vous d'avoir PHP 8.0+ et Composer installés. Créez un nouveau dossier pour le projet et placez-vous dedans :
mkdir graphql-php-tutorial
cd graphql-php-tutorial
Installez maintenant la bibliothèque principale webonyx/graphql-php avec Composer :
composer require webonyx/graphql-php
Pour travailler avec la base de données, nous utiliserons PDO, qui est intégré à PHP. Installez également une bibliothèque pour l'analyse pratique des requêtes :
composer require graphql-php/graphql-php
Créez le fichier index.php — ce sera le point d'entrée de notre application. Configurez l'autoloading de Composer et la structure de base :
<?php
require_once __DIR__ . '/vendor/autoload.php';
use GraphQL\\GraphQL;
use GraphQL\\Type\\Schema;
use GraphQL\\Type\\Definition\\ObjectType;
use GraphQL\\Type\\Definition\\Type;
// Notre logique sera ici
Créez également un fichier schema.graphql pour stocker le schéma au format texte (optionnel, mais pratique pour les grands projets).
2. Définition du schéma et des types de données
Le cœur de toute API GraphQL est le schéma. Il décrit quelles données sont disponibles et comment y accéder. Dans notre exemple, nous allons créer un modèle simple d'utilisateur (User) et d'article (Post).
Commençons par définir les types. Dans le fichier index.php, ajoutez les classes suivantes :
// Type User
$userType = new ObjectType([
'name' => 'User',
'fields' => [
'id' => Type::int(),
'name' => Type::string(),
'email' => Type::string(),
'posts' => [
'type' => Type::listOf($postType),
'resolve' => function ($user) use ($db) {
// Fonction résolveur pour charger les articles de l'utilisateur
$stmt = $db->prepare('SELECT * FROM posts WHERE user_id = :id');
$stmt->execute([':id' => $user['id']]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
]
]
]);
// Type Post
$postType = new ObjectType([
'name' => 'Post',
'fields' => [
'id' => Type::int(),
'title' => Type::string(),
'content' => Type::string(),
'author' => [
'type' => $userType,
'resolve' => function ($post) use ($db) {
$stmt = $db->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute([':id' => $post['user_id']]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
]
]
]);
Notez les résolveurs — ce sont des fonctions qui déterminent comment obtenir les données pour chaque champ. Dans l'exemple ci-dessus, nous utilisons PDO pour les requêtes à la base de données.
Créons mainten