© VetraKori/Shutterstock.com
GraphQL-Schnittstelle mit Lighthouse PHP und Eloquent automatisch erzeugen

Einfach und praktisch: Laravel mit GraphQL


Lighthouse PHP ist ein Framework für Laravel, das das Erstellen von GraphQL-Schnittstellen vereinfacht. Dank Direktiven und Automatisierungen wird die Arbeit für den Entwickler auf das Wesentliche beschränkt: Planung und Datendesign. Für den Nutzer der GraphQL-Schnittstelle wird die Arbeit durch die Autovervollständigung ebenfalls enorm erleichtert.

Als Client bestimmt man selbst, welche Daten benötigt werden und hat somit die Datenflut in der Hand – in diesem Artikel werden wir das direkt am GraphQL Playground erleben. Mit dem Tool können problemlos eigene Abfragen erstellt und getestet werden. Im realen Einsatz ist dank Werkzeugen wie dem GraphQL Code Generator die Verwendung in Frontend-Frameworks wie Vue.js fast schon magisch, da sich Befehle für die API-Kommunikation automatisch generieren lassen. Als Beispielprojekt werden wir in diesem Artikel einen kleinen Blog erstellen. Grundlegendes Wissen zu PHP, Composer und Laravel werden dabei vorausgesetzt.

Installation

Starten wir zunächst ein einfaches Laravel-Projekt. Dieser Vorgang variiert je nach Betriebssystem, weshalb an dieser Stelle auf die offizielle Dokumentation verwiesen sei [1]. Im nächsten Schritt fügen wir mit Composer das Framework Lighthouse hinzu, bei Benutzung von Laravel Sail sollte das in der Shell (sail up -d && sail shell) passieren. Im Folgenden ist die Vorgehensweise mittels Composer zu sehen:

composer require nuwave/lighthouse php artisan vendor:publish --tag=lighthouse-schema

Durch den zweiten Befehl wird ein Schema im Verzeichnis graphql generiert. Dieses beschreibt die Schnittstelle von GraphQL und beinhaltet zunächst zwei Queries, um Daten aus dem Model User auszulesen. Wir werden die Datei später noch bearbeiten. Als Nächstes installieren wir den GraphQL Playground, mit dem sich die GraphQL-Schnittstelle am besten testen lässt:

composer require mll-lab/laravel-graphql-playground

Da wir die Daten in einer MySQL-Datenbank speichern, muss diese ebenfalls eingerichtet werden.

Am Anfang ist die Datenstruktur

Für dieses Beispielprojekt verwenden wir eine möglichst einfache Datenstruktur, wir nutzen folgende Models:

  • Blog wird einen Blogeintrag enthalten.

  • Author wird einen Blogautor repräsentieren.

Wir erstellen die Model-Dateien sowie die Migration-Dateien und halten sie dabei so einfach wie möglich. Wir erstellen, bzw. arbeiten zuerst den Author aus, weil wir im Blog darauf verweisen wollen. In unserem Fall hat ein Blog einen einzigen Autor:

php artisan make:model Author -mf php artisan make:model Blog -mf

Für die nötigen Tabellen sind nur wenige Spalten in unseren Migration-Dateien erforderlich, wie in den Listings 1 und 2 zu sehen ist.

Listing 1

database/migrations/...create_authors_table.php public function up() { Schema::create('authors', function (Blueprint $table) { // Der Autor hat nur einen Namen,   // eine ID, Erstellungs- und Aktualisierungsdatum $table->id(); $table->timestamps(); $table->string('name'); }); }

Listing 2

database/migrations/…create_blogs_table.php public function up() { Schema::create('blogs', function (Blueprint $table) { // Der Blog hat einen Titel, Inhalt, einen Autor,  // eine ID, Erstellungs- und Aktualisierungsdatum $table->id(); $table->timestamps(); $table->string('title'); $table->mediumText('content'); $table->foreignIdFor(\App\Models\Author::class); }); }

Mit php artisan migrate können wir nun die Änderungen in die MySQL-Datenbank schreiben. Jetzt tragen wir noch eine Beziehung zwischen Author und Blog im Model ein (Listing 3), wobei es für Lighthouse etwas Wichtiges zu beachten gilt: Der Rückgabetyp muss bei der Beziehungsfunktion mit angegeben werden, Lighthouse kann Beziehungen ansonsten nicht automatisch erkennen (Listing 4).

Listing 3

app/Models/Author.php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class Author extends Model { public $fillable = ['name']; public function blog() : HasMany{ return $this->hasMany(Blog::class); } }

Listing 4

app/Models/Blog.php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class Blog extends Model { public $fillable = ['title','content']; public function author() : BelongsTo{ return $this->belongsTo(Author::class); } }

Damit haben wir eine einfache Datenstruktur, mit der wir experimentieren...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang