Einführung in GraphQL und PHP
GraphQL ist eine Abfragesprache für APIs, entwickelt von Facebook, die es Clients ermöglicht, nur die Daten anzufordern, die sie tatsächlich benötigen. Im Gegensatz zu REST, wo jeder Endpunkt eine feste Datenstruktur zurückgibt, bietet GraphQL Flexibilität und Effizienz. Wenn Sie mit PHP arbeiten und eine moderne API implementieren möchten, ist dieses Tutorial genau das Richtige für Sie.
In dieser Anleitung erstellen wir eine einfache, aber funktionale GraphQL-API mit der Bibliothek webonyx/graphql-php. Sie lernen, wie Sie Abhängigkeiten installieren, ein Schema, Typen und Resolver definieren sowie Anfragen verarbeiten. Die Codebeispiele helfen Ihnen, schnell zu starten.
1. Umgebungsvorbereitung und Installation der Abhängigkeiten
Stellen Sie zunächst sicher, dass PHP Version 7.4 oder höher und Composer – der Abhängigkeitsmanager für PHP – installiert sind. Falls Composer noch nicht installiert ist, laden Sie es von der offiziellen Website herunter.
Erstellen Sie ein neues Projekt und installieren Sie die Bibliothek webonyx/graphql-php:
mkdir graphql-php-tutorialcd graphql-php-tutorialcomposer init --name="myapp/graphql-demo" --type="project" --no-interactioncomposer require webonyx/graphql-phpNach der Installation erscheinen im Projektordner das Verzeichnis vendor und die Datei composer.json. Erstellen Sie außerdem eine Datei index.php – darin wird unser gesamter Code stehen.
Installieren Sie zusätzlich für die bequeme Arbeit mit HTTP-Anfragen laminas/laminas-diactoros (eine gängige PSR-7-Implementierung) und laminas/laminas-httphandlerrunner:
composer require laminas/laminas-diactoroscomposer require laminas/laminas-httphandlerrunner2. Definition des GraphQL-Schemas und der Typen
Das Herzstück jeder GraphQL-API ist das Schema. Es beschreibt, welche Daten verfügbar sind und wie sie abgefragt werden können. In unserem Beispiel erstellen wir ein einfaches Modell für "Benutzer" (User) und "Beitrag" (Post).
Definieren Sie zunächst die Typen mit der Klasse GraphQL\\Type\\Definition\\ObjectType. Erstellen Sie eine Datei schema.php (oder fügen Sie den Code direkt in index.php ein).
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema;use GraphQL\\GraphQL;
// Typ User definieren$userType = new ObjectType([ 'name' => 'User', 'description' => 'Stellt einen Systembenutzer dar', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'email' => Type::string(), ]]);
// Typ Post definieren$postType = new ObjectType([ 'name' => 'Post', 'description' => 'Ein Benutzerbeitrag', 'fields' => [ 'id' => Type::int(), 'title' => Type::string(), 'content' => Type::string(), 'author' => $userType, // Verknüpfung mit Benutzer ]]);Beachten Sie: Wir verwenden Type::int() und Type::string() – dies sind die eingebauten skalaren GraphQL-Typen. Das Feld author verweist auf einen anderen Objekttyp, was verschachtelte Abfragen ermöglicht.
3. Erstellung von Resolvern und Dummy-Daten
Resolver sind Funktionen, die Daten für jedes Feld zurückgeben. Im einfachsten Fall können wir Dummy-Daten (Arrays) verwenden.
Fügen wir Resolver für den Wurzeltyp Query hinzu. Über diesen werden Clients Daten abrufen.
// Dummy-Daten$users = [ 1 => ['id' => 1, 'name' => 'Ivan Petrov', 'email' => 'ivan@example.com'], 2 => ['id' => 2, 'name' => 'Maria Smirnova', 'email' => 'maria@example.com'],];
$posts = [ 1 => ['id' => 1, 'title' => 'Erster Eintrag', 'content' => 'Text des ersten Eintrags', 'author_id' => 1],