Introduction à GraphQL avec PHP : pourquoi l'essayer
\n\nGraphQL est un langage de requêtes moderne pour les API, développé par Facebook. Contrairement à REST, où chaque endpoint renvoie une structure de données fixe, GraphQL permet au client de demander uniquement les champs dont il a besoin. Cela réduit le volume de données transmises et simplifie le développement d'applications complexes.
\n\nDans ce tutoriel, nous allons créer une API GraphQL complète en PHP en utilisant la bibliothèque webonyx/graphql-php. Vous apprendrez à définir un schéma, écrire des résolveurs, traiter les requêtes et mutations, et tester l'API via GraphiQL.
\n\nIl est supposé que vous avez installé PHP 8.0+ et Composer. Si ce n'est pas le cas, commencez par les installer.
\n\nInstallation et configuration du projet
\n\nÉtape 1 : Création du projet et installation des dépendances
\n\nCréez un nouveau répertoire pour le projet et initialisez Composer :
\n\nmkdir graphql-php-tutorial\ncd graphql-php-tutorial\ncomposer init\n\nInstallez la bibliothèque webonyx/graphql-php :
composer require webonyx/graphql-php\n\nInstallez également nikic/fast-route pour un routage simple (optionnel mais pratique) :
composer require nikic/fast-route\n\nÉtape 2 : Structure du projet
\n\nCréez la structure de dossiers suivante :
\n\ngraphql-php-tutorial/\n├── src/\n│ ├── Schema/\n│ │ └── schema.php\n│ ├── Resolvers/\n│ │ ├── QueryResolver.php\n│ │ └── MutationResolver.php\n│ └── Data/\n│ └── Database.php\n├── public/\n│ └── index.php\n├── vendor/\n└── composer.json\n\nCréation du schéma GraphQL
\n\nÉtape 3 : Définition des types et du schéma
\n\nCréons un modèle de données simple : utilisateur (User) et publication (Post). Ouvrez src/Schema/schema.php et ajoutez le code suivant :
<?php\n\nnamespace App\\Schema;\n\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\nuse GraphQL\\Type\\Schema as GraphQLSchema;\n\nclass Schema\n{\n public static function build(): GraphQLSchema\n {\n // Type User\n $userType = new ObjectType([\n 'name' => 'User',\n 'fields' => [\n 'id' => Type::int(),\n 'name' => Type::string(),\n 'email' => Type::string(),\n 'posts' => [\n 'type' => Type::listOf(function() use (&$postType) {\n return $postType;\n }),\n 'resolve' => function($user) {\n return \\App\\Resolvers\\QueryResolver::getPostsByUser($user['id']);\n }\n ]\n ]\n ]);\n\n // Type Post\n $postType = new ObjectType([\n 'name' => 'Post',\n 'fields' => [\n 'id' => Type::int(),\n 'title' => Type::string(),\n 'content' => Type::string(),\n 'author' => [\n 'type' => $userType,\n 'resolve' => function($post) {\n return \\App\\Resolvers\\QueryResolver::getUserById($post['author_id']);\n }\n ]\n ]\n ]);\n\n // Type racine Query\n $queryType = new ObjectType([\n 'name' => 'Query',\n 'fields' => [\n 'users' => [\n 'type' => Type::listOf($userType),\n 'resolve' => function() {\n return \\App\\Resolvers\\QueryResolver::getAllUsers();\n }\n ],\n 'user' => [\n 'type' => $userType,\n 'args' => [\n 'id' => Type::nonNull(Type::int())\n ]