GraphQL API mit PHP: Schritt-für-Schritt-Tutorial in der Praxis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in GraphQL mit PHP: Warum es sich lohnt, es auszuprobieren

\n\n

GraphQL 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\n

In 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\n

Es wird vorausgesetzt, dass PHP 8.0+ und Composer installiert sind. Falls nicht, beginnen Sie mit deren Installation.

\n\n

Projektinstallation und -einrichtung

\n\n

Schritt 1: Projekt erstellen und Abhängigkeiten installieren

\n\n

Erstellen Sie ein neues Verzeichnis für das Projekt und initialisieren Sie Composer:

\n\n
mkdir graphql-php-tutorial\ncd graphql-php-tutorial\ncomposer init
\n\n

Installieren Sie die Bibliothek webonyx/graphql-php:

\n\n
composer require webonyx/graphql-php
\n\n

Installieren Sie außerdem nikic/fast-route für einfaches Routing (optional, aber praktisch):

\n\n
composer require nikic/fast-route
\n\n

Schritt 2: Projektstruktur

\n\n

Erstellen Sie die folgende Ordnerstruktur:

\n\n
graphql-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\n

Erstellung des GraphQL-Schemas

\n\n

Schritt 3: Definition von Typen und Schema

\n\n

Erstellen wir ein einfaches Datenmodell: Benutzer (User) und Beitrag (Post). Öffnen Sie src/Schema/schema.php und fügen Sie den folgenden Code hinzu:

\n\n
<?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                    ]                

Blogs

Buchempfehlungen