Eigene Middleware für Laravel 5.2

Middleware wird in Laravel 5 genutzt, um eingehende HTTP-Anfragen zu filtern. So kann zum Beispiel geprüft werden, ob ein Benutzer eingeloggt ist oder gewisse Berechtigungen besitzt. Auch wenn Laravel einige Middlewares mitbringt, kann es sinnvoll sein, eine eigene Middleware für Laravel zu schreiben.

Im folgenden Beispiel wollen wir deshalb eine Middleware schreiben, die überprüft, ob ein User einer bestimmten Benutzergruppe angehört.

Funktionsumfang der eigenen Middleware

Wir wollen erreichen, dass wir unsere Middleware in der routes.php einer einzelnen Route oder auch einer Route-Gruppe zuweisen können. Zudem soll ein Parameter an die Middleware übergeben werden, welcher die benötigte Benutzergruppe beinhaltet. Das Ganze soll beispielhaft so aussehen:

Ablauf

Bis zur funktionsfähigen eigenen Middleware sind folgende Schritte notwendig:

  1. Eigene Middleware-Klasse anlegen
  2. Middleware-Klasse mit der Funktionslogik füllen
  3. Middleware registrieren
  4. Middleware an Route (-Gruppen) binden

Hinweis: Damit diese Middleware funktioniert, wird vorausgesetzt, dass du sowohl ein User-Model, als auch ein Usergroup-Model hast. Im vorliegenden Beispiel habe ich folgende Tabellen in der Datenbank:

Benötigte Migrations für die eigene Middleware

Es handelt sich hierbei um eine sehr einfache Form einer Benutzergruppenzuordnung (ist schließlich nur ein Beispiel).

Eigene Middleware Klasse anlegen

Um die benötigte Klasse anzulegen, greifen wir einfach auf den artisan make:middleware Befehl zurück. In unserem Fall wollen wir die Middleware UserGroupMiddleware nennen, also musst du Folgendes in deine Eingabeaufforderung/ Terminal eingeben:

Hinweis: Du musst die Eingabeaufforderung im root-Verzeichnis deines Projekts ausführen, also dort, wo auch deine .env-Datei liegt. Windowsnutzer können einfach im Projektordner Shift+Rechtsklick und dann auf „Eingabeaufforderung hier öffnen“ gehen.

Somit wäre unsere eigene Middleware-Klasse auch schon angelegt. Du findest die Datei unter */app/Http/Middleware/UserGroupMiddleware.php. Öffne diese Datei für den nächsten Schritt.

Middleware-Klasse mit Funktionslogik füllen

Wie du siehst, ist die Klasse noch recht leer. Es gibt lediglich eine Methode handle. Diese reicht auch schon aus, allerdings müssen wir der Methode neben $requestClosure $next noch einen dritten Parameter $group mitgeben:

Der $group Parameter soll in unserem Beispiel die benötigte Benutzergruppe beinhalten, und zwar in Url-freundlicher Form (also „admin“ statt „Admin“ oder „gaeste“ statt „Gäste“). In der Usergroups-Tabelle haben wir dafür das Feld „slug“. Dieses beinhaltet die url-freundliche Form vom Feld „name“.

Da unsere Middleware so immernoch jede Anfrage durchlässt, werden wir nun überprüfen, ob überhaupt ein Benutzer angemeldet ist:

Wir prüfen also, ob überhaupt eine User-Instanz vorliegt. Dies ist nötig, da wir sonst eine Fehlermeldung verursachen würden. Wenn der Benutzer nicht eingeloggt ist, wird er zur Login-Seite weitergeleitet.

Im nächsten Schritt überprüfen wir, ob der Benutzer Mitglied der erforderlichen  Benutzergruppe ist, welche in $group hinterlegt ist:

Somit haben wir auch schon die finale Form unserer ganz eigenen Middleware. Also weiter zum nächsten Schritt.

Middleware registrieren

Um unsere Middleware zu registrieren, müssen wir app/Http/Kernel.php öffnen. Darin findest du drei Attribute, die jeweils mit einem Array belegt sind:

  • $middleware
  • $middlewareGroups
  • $routeMiddleware

Für uns interessant ist lediglich das letzte Attribut. In diesem Array werden wir nun unsere eben erstellte Middleware registrieren und somit verfügbar machen. Ergänze das Array also um folgenden Eintrag:

group legt fest, wie wir unsere Middleware in eine Route (-Gruppe) einbinden.

Nun können wir mit dem letzten Schritt fortfahren.

Middleware an Route (-Gruppen) binden

Öffne app/Http/routes.php. Du kannst nun die Middleware an Routen und Route-Gruppen binden:

Wenn du die Middleware einer Gruppe zuordnest, sind alle darin enthaltenen Routen gesichert. Du musst also nicht extra jeder Route die Middleware zuordnen.

Natürlich kannst du auch einzelnen Routen unsere Middleware zuordnen.

Ich hoffe, dass ich dir mit diesem kleinen Tutorial die Materie der Middleware in Laravel etwas verständlicher machen konnte. Hinterlasse doch ein Kommentar, wenn du Anregungen und/ oder Anmerkungen hast.

Englischsprachige Dokumentation zu Middleware in Laravel

5 Kommentare


  1. Klasse Tutorial,

    super erklärt und einfach beschrieben!

    Leider blickt man bei der Laravel Documentation nicht immer gut durch.

    Hoffe auf viele weitere Tutorials.

    Viele Grüße

    Antworten

    1. Hey,

      danke für dein Kommentar!

      Du kannst mir gerne mitteilen, was dich zum Thema Laravel interessiert. Ich berücksichtige das dann in den kommenden Tutorials 🙂

      Antworten

    2. Also ich habe ehrlich gesagt schon schlechtere Dokus, als die von Laravel gesehen. 😉

      Antworten

      1. Ja, da hast du recht. Es gibt wesentliche schlechtere Dokus. Aber stellenweise fehlt der Laravel-Doku einfach das letzte i-Tüpfelchen. Gerade Anfängern fehlt stellenweise ein komplettes Beispiel anstatt der kurzen Code-Auszüge.

        Antworten

  2. Als ich vor diesem Problem stand hätte ich gerne diese Anleitung gehabt. Eine wirklich sehr gute und ausführliche, praxisnahe Lösung die funktioniert!

    Seit einigen Wochen beschäftige ich mich mit JavaScript und den der Onepage Kompatibilität von Laravel und z.B. JS Frameworks wie VueJS oder Angular. In der englischen Laravel Community scheint ja VueJS sehr verbreitet zu sein und man kann wohl mit Vue Resource auch AJAX Anfragen an z.B. eine programmierte API von Laravel senden und die Daten als JSON Objekt entgegen nehmen. Bisher habe ich das ganze aber noch nicht zum Laufen bekommen.

    Antworten

Schreibe einen Kommentar

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