GraphQL PHP-Bibliothek: webonyx/graphql-php
In der modernen Webentwicklung entsteht immer häufiger der Bedarf an flexiblen und effizienten APIs. Traditionelle REST-Dienste leiden oft unter übermäßiger oder unzureichender Datenlast. GraphQL ist eine von Facebook entwickelte Abfragesprache und Laufzeitumgebung, die es Clients ermöglicht, genau die Daten anzufordern, die sie benötigen. Für PHP ist eine der beliebtesten Implementierungen die Bibliothek webonyx/graphql-php.
Diese Bibliothek bietet einen vollständigen Satz von Werkzeugen zum Erstellen von GraphQL-Servern in PHP: von der Definition des Typschemas bis zur Verarbeitung komplexer Abfragen mit verschachtelten Beziehungen. Sie eignet sich ideal für die Erstellung moderner APIs für Webanwendungen, mobile Apps und SPAs (Single Page Applications).
Hauptfunktionen von webonyx/graphql-php
- Vollständige Unterstützung der GraphQL-Spezifikation (Juni 2018) – alle Typen, Direktiven, Variablen und Fragmente.
- Typsystem basierend auf PHP-Objekten – Definition von Typen, Schnittstellen, Union-Typen und Enums.
- Integrierte Resolver – Möglichkeit, die Logik zum Abrufen von Daten für jedes Feld festzulegen.
- Abfragevalidierung – automatische Überprüfung von Syntax und Typen.
- Unterstützung für Lazy Loading – Daten werden nur bei Bedarf geladen.
- Kompatibilität mit gängigen Frameworks – Laravel, Symfony, Yii2 über Wrapper-Pakete.
Installation und Konfiguration
Die Installation erfolgt über Composer:
composer require webonyx/graphql-phpFür den Betrieb wird PHP 7.1+ mit der Erweiterung mbstring benötigt. Nach der Installation erstellen wir einen einfachen Server.
Beispiel: Erstellung eines GraphQL-Schemas
Betrachten wir ein einfaches Beispiel – das Abrufen einer Liste von Büchern und Autoren. Zuerst definieren wir die Typen:
<?phpuse GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema;
// Typ "Author"$authorType = new ObjectType([ 'name' => 'Author', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'books' => [ 'type' => Type::listOf($bookType), // wird unten definiert 'resolve' => function ($author) { // Angenommen, es gibt eine Funktion getBooksByAuthorId() return getBooksByAuthorId($author['id']); } ] ]]);
// Typ "Book" (Definition mit Closure für zirkuläre Referenzen)$bookType = new ObjectType([ 'name' => 'Book', 'fields' => function() use ($authorType) { return [ 'id' => Type::int(), 'title' => Type::string(), 'author' => [ 'type' => $authorType, 'resolve' => function ($book) { return getAuthorById($book['author_id']); } ] ]; }]);
// Typ "Query"$queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'books' => [ 'type' => Type::listOf($bookType), 'resolve' => function() { return getAllBooks(); } ], 'author' => [ 'type' => $authorType, 'args' => [ 'id' => Type::nonNull(Type::int()) ], 'resolve' => function($root, $args) { return getAuthorById($args['id']); } ] ]]);
// Schema erstellen$schema = new Schema([ 'query' => $queryType]);Abfrageverarbeitung
Jetzt schreiben wir den Code, der eine GraphQL-Abfrage entgegennimmt und das Ergebnis zurückgibt:
<?phpuse GraphQL\\GraphQL;use GraphQL\\Error\\DebugFlag;
// Abfragekörper aus der Eingabe holen