GraphQL API mit PHP: Schritt-für-Schritt-Tutorial in der Praxis
GraphQL ist eine Abfragesprache für APIs, die es Clients ermöglicht, nur die Daten zu erhalten, die sie wirklich benötigen. Im Gegensatz zu REST, wo jeder Endpunkt eine feste Struktur zurückgibt, bietet GraphQL Flexibilität und Effizienz. In diesem Tutorial erstellen wir eine vollständige GraphQL API mit PHP von Grund auf – von der Installation der Bibliotheken bis zur Verarbeitung von Abfragen und Mutationen.
Warum GraphQL und PHP ein hervorragendes Paar sind
PHP bleibt eine der beliebtesten Sprachen für die Serverentwicklung. Mit der Bibliothek webonyx/graphql-php können Sie GraphQL problemlos in jedes Projekt integrieren – von einem einfachen Blog bis zu einer komplexen CRM. Die Hauptvorteile:
- Flexibilität der Abfragen – der Client entscheidet selbst, welche Felder abgerufen werden.
- Ein einziger Einstiegspunkt – statt mehrerer Endpunkte nur ein
/graphql. - Strenge Typisierung – das Schema definiert alle Typen und Beziehungen.
- Bequemlichkeit für das Frontend – React, Vue und andere Frameworks arbeiten problemlos mit GraphQL.
Schrittweise Implementierung einer GraphQL API mit PHP
1. Installation und Einrichtung der Umgebung
Zunächst erstellen wir ein neues Projekt und installieren die Hauptbibliothek über Composer:
composer require webonyx/graphql-phpAußerdem benötigen wir einen PSR-7-kompatiblen HTTP-Handler. Wir verwenden guzzlehttp/psr7 und nyholm/psr7-server:
composer require guzzlehttp/psr7 nyholm/psr7-serverErstellen wir eine grundlegende Ordnerstruktur:
project/├── src/│ ├── Schema/│ ├── Resolvers/│ └── Types/├── public/│ └── index.php├── vendor/└── composer.json2. Definition des GraphQL-Schemas
Das Schema ist das Herzstück der GraphQL API. Es beschreibt die Datentypen und verfügbaren Operationen. Erstellen wir die Datei src/Schema/Schema.php:
<?phpnamespace App\\Schema;
use GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema as GraphQLSchema;
class Schema{ public static function build(): GraphQLSchema { // Typ "User" $userType = new ObjectType([ 'name' => 'User', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'email' => Type::string(), ] ]);
// Typ "Query" – die Wurzelabfrage $queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'user' => [ 'type' => $userType, 'args' => [ 'id' => Type::nonNull(Type::int()) ], 'resolve' => function ($root, $args) { // Hier wird der Resolver sein return UserResolver::getUser($args['id']); } ], 'users' => [ 'type' => Type::listOf($userType), 'resolve' => function () { return UserResolver::getAllUsers(); } ] ] ]);
// Typ "Mutation" – die Wurzelmutation $mutationType = new ObjectType([ 'name' => 'Mutation', 'fields' => [ 'createUser' => [ 'type' => $userType, 'args' => [ 'name' => Type::nonNull(Type::string()), 'email' => Type::nonNull(Type::string()) ], 'resolve' => function ($root, $args) { return UserResolver::createUser($args['name'], $args['email']); } ] ] ]);
return new GraphQLSchema([