Wie man mit dem Lumen Framework eine REST API erstellt
„Wenn es schon PHP sein muss, dann nimm aber Lumen“, heißt es. Wir schauen mal, wie gut das funktioniert.
Erst kürzlich haben wir in einem Artikel kurz umrissen, wie man mittels ReactPHP einen eigenen HTTP-Server erstellt und darauf eine REST API aufbaut. Nun wollen wir uns für das gleiche Vorhaben das Lumen-Framework anschauen.
Lumen ist ein Light-Weight-Framework genau für diese Anforderung: Erstellen von Laravel-basierten Mikrodiensten und APIs. Und tatsächlich ist es eines der schnellsten verfügbaren Mikro-Frameworks.
Vorteil eines Lumen-Projektes gegenüber der Lösung mittels ReactPHP ist, dass wir keinen eigenen HTTP-Server implementieren und laufen lassen müssen. Somit kann die Lumen-Anwendung ganz einfach auch zu einem Webhoster deployed werden.
Vorbereitung
Zunächst erstellen wir ein neues Lumen-Projekt mittels Composer.
Folgender Befehl erstellt ein lauffähiges Projekt mit allen Abhängigkeiten im Ordner lumen-api.
php composer.phar create-project --prefer-dist laravel/lumen lumen-api
Lokal kann man jetzt den Build-In Server von PHP nutzen und folgen Aufruf starten.
php -S localhost:8000 -t public
Ruft man nun localhost:8000 im Browser auf, sieht man eine Seite mit folgender Ausgabe.
Lumen (5.8.10) (Laravel Components 5.8.*)
Ich nutze XAMPP zur lokalen Entwicklung von PHP-Projekten. Den Lumen-Projektordner habe ich dort unter htdocs angelegt. Der Apache läuft auf Port 8080.
Damit ist der Browseraufruf folgendermaßen: localhost:8080/lumen-api/public/
Folgende Versionen wurden verwendet:
PHP: 7.3.1
Composer: 1.8.6
Der Einfachheit halber verzichten wir in diesem Beispiel auf Datenbankoperationen. Wie einfach diese in dem Lumen-Projekt zu benutzen sind, zeigen die am Ende verlinkten Artikel.
Route hinzufügen
Wir beginnen nun, erste Routen hinzuzufügen. Dazu öffnen wir die Datei web.php im Verzeichnis routes und fügen folgendes hinzu.
$router->group(['prefix'=>'api'], function() use($router){ $router->get('/items', 'ItemController@all'); $router->get('/items/{id}', 'ItemController@get'); });
Die erste Route soll alle Items zurückgeben, die zweite Route genau eins per Id.
Controller implementieren
Als nächstes implementieren wir den in der Route angegebenen ItemContoller mit den benötigten Methoden. Dazu erstellen wir eine neue Datei ItemController.php unter app/Http/Controllers.
Im Konstruktor bauen wir ein Array für die Beispieldaten, die in den Methoden all und get verwendet werden.
namespace App\Http\Controllers; use Illuminate\Http\Request; class ItemController extends Controller { private $items; public function __construct() { $this->items = array(); for($i = 0; $i<10; $i++) { $item = array( 'id' => $i, 'name' => "item-" . $i ); $this->items[] = $item; } } public function all() { return response()->json($this->items); } public function get($id) { $found_key = array_search($id, array_column($this->items, 'id')); return response()->json($this->items[$found_key]); } }
Aufruf der API
Jetzt können wir die API Methoden aufrufen.
Folgender Aufruf liefert alle Items als JSON zurück.
Der Response sollte so aussehen:
HTTP/1.1 200 OK Date: Tue, 09 Jul 2019 11:38:49 GMT Server: Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.3.1 X-Powered-By: PHP/7.3.1 Cache-Control: no-cache, private Content-Length: 251 Keep-Alive: timeout=5, max=99 Connection: Keep-Alive Content-Type: application/json [ { "id": 0, "name": "item-0" }, { "id": 1, "name": "item-1" }, ... { "id": 9, "name": "item-9" } ]
Folgender Aufruf liefert ein Item mit der Id=3 als JSON zurück.
Und so sieht der Response aus:
HTTP/1.1 200 OK Date: Tue, 09 Jul 2019 11:38:49 GMT Server: Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.3.1 X-Powered-By: PHP/7.3.1 Cache-Control: no-cache, private Content-Length: 251 Keep-Alive: timeout=5, max=99 Connection: Keep-Alive Content-Type: application/json { "id": 3, "name": "item-3" }
Deploying zu einem Shared Webhoster
Die komplette Anwendung können wir nun einfach in einen Ordner in unserem Webspace hochladen.
Zum Benutzen der API aus Client-Anwendungen heraus, ist es dann am Einfachsten, eine Subdomain anzulegen, die auf den puplic-Ordner der Lumen-Anwendung zeigt.
Z.B. app.meine-domain.com zeigt auf den public-Ordner der Lumen-Anwendung.
Die API kann dann so aufgerufen werden:
Fazit
Das ging schnell. Lumen bietet auf elegante Art und Weise alles, was man für den Start einer REST API benötigt.
Das soll es fürs Erste gewesen sein. In einem weiteren Artikel werden wir uns die Authentifizierung anschauen.
Bis dahin hoffe ich, diese erstbeste Anleitung war hilfreich.
Quellen:
- Lumen Documentation
- Deploying Laravel / Lumen on a Shared Hosting
- Developing RESTful APIs with Lumen
- Building a REST API with Lumen
Weitere Beiträge unserer Lumen-Serie:
JWT Auth – Wie man eine REST API mit dem Lumen Framework um eine JWT Authentifizierung erweitert
Sie sehen gerade einen Platzhalterinhalt von X. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr Informationen
Klingt vielversprechend. Jetzt muß es nur noch funktionieren.
?? Warum funktionieren
Bereits beim ersten Befehl folgt einer Fehlermedlung:
[UnexpectedValueException]
Could not parse version constraint lumen-api: Invalid version string „lumen-api“
Hmm. Welche Composer-Version verwendest Du? Und welche PHP-Version? Ich habe es eben mit Composer 2.0.9 und PHP 7.3.1 ausprobiert und das Lumen Projekt wird ohne Fehler erstellt.
Danke für die Informationen zu Lumen. Das ist sehr hilfreich.
Es kann immer sinnvoll sein auf dieses kleine, schlanke Laravel Framework zu setzen. Sehr spannend.
Danke auch für die Anleitung zur REST API Entwicklung.