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.

GET http://localhost:8080/lumen-api/public/api/items/

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.

GET http://localhost:8080/api/public/api/items/3

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:

GET http://app.meine.domain.com/api/items/

 

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:


Weitere Beiträge unserer Lumen-Serie:

JWT Auth – Wie man eine REST API mit dem Lumen Framework um eine JWT Authentifizierung erweitert

Wie man Mails versendet mit dem Lumen Framework

Ähnliche Beiträge

3 Kommentare

  1. 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“

    1. 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.

  2. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert