Einführung in GraphQL mit PHP: Warum es sich lohnt, es auszuprobieren
\n\nGraphQL ist eine moderne Abfragesprache für APIs, entwickelt von Facebook. Im Gegensatz zu REST, wo jeder Endpunkt eine feste Datenstruktur zurückgibt, erlaubt GraphQL dem Client, nur die Felder anzufragen, die er benötigt. Dies reduziert die Menge der übertragenen Daten und vereinfacht die Entwicklung komplexer Anwendungen.
\n\nIn diesem Tutorial erstellen wir eine vollwertige GraphQL API mit PHP unter Verwendung der Bibliothek webonyx/graphql-php. Sie erfahren, wie Sie ein Schema definieren, Resolver schreiben, Abfragen und Mutationen verarbeiten und die API über GraphiQL testen.
\n\nEs wird vorausgesetzt, dass PHP 8.0+ und Composer installiert sind. Falls nicht, beginnen Sie mit deren Installation.
\n\nProjektinstallation und -einrichtung
\n\nSchritt 1: Projekt erstellen und Abhängigkeiten installieren
\n\nErstellen Sie ein neues Verzeichnis für das Projekt und initialisieren Sie Composer:
\n\nmkdir graphql-php-tutorial\ncd graphql-php-tutorial\ncomposer init\n\nInstallieren Sie die Bibliothek webonyx/graphql-php:
composer require webonyx/graphql-php\n\nInstallieren Sie außerdem nikic/fast-route für einfaches Routing (optional, aber praktisch):
composer require nikic/fast-route\n\nSchritt 2: Projektstruktur
\n\nErstellen Sie die folgende Ordnerstruktur:
\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\nErstellung des GraphQL-Schemas
\n\nSchritt 3: Definition von Typen und Schema
\n\nErstellen wir ein einfaches Datenmodell: Benutzer (User) und Beitrag (Post). Öffnen Sie src/Schema/schema.php und fügen Sie den folgenden Code hinzu:
<?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 // Typ 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 // Typ 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 // Root-Typ 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 ]