# Routen-Middleware Flight unterstützt Routen- und Gruppenrouten-Middleware. Middleware ist eine Funktion, die vor (oder nach) dem Routenrückruf ausgeführt wird. Dies ist eine großartige Möglichkeit, API-Authentifizierungsprüfungen in Ihrem Code hinzuzufügen oder zu validieren, ob der Benutzer die Berechtigung hat, auf die Route zuzugreifen. ## Grundlegende Middleware Hier ist ein grundlegendes Beispiel: ```php // Wenn Sie nur eine anonyme Funktion bereitstellen, wird sie vor dem Routenrückruf ausgeführt. Es gibt keine "nach" Middleware-Funktionen außer Klassen (siehe unten) Flight::route('/pfad', function() { echo ' Hier bin ich!'; })->addMiddleware(function() { echo 'Middleware zuerst!'; }); Flight::start(); // Dies gibt "Middleware zuerst! Hier bin ich!" aus
Es gibt einige sehr wichtige Hinweise zur Middleware, die Sie kennen sollten, bevor Sie sie verwenden:
Flight::redirect()
function($params) { ... }
public function before($params) {}
flight\Engine
__construct()
Middleware kann auch als Klasse registriert werden. Wenn Sie die "nach" Funktionalität benötigen, müssen Sie eine Klasse verwenden.
class MyMiddleware { public function before($params) { echo 'Middleware zuerst!'; } public function after($params) { echo 'Middleware zuletzt!'; } } $MyMiddleware = new MyMiddleware(); Flight::route('/pfad', function() { echo ' Hier bin ich! '; })->addMiddleware($MyMiddleware); // auch ->addMiddleware([ $MyMiddleware, $MyMiddleware2 ]); Flight::start(); // Dies zeigt "Middleware zuerst! Hier bin ich! Middleware zuletzt!" an
Angenommen, Sie haben eine Authentifizierungs-Middleware und möchten den Benutzer auf eine Login-Seite umleiten, wenn er nicht authentifiziert ist. Sie haben ein paar Optionen zur Verfügung:
Hier ist ein einfaches Beispiel mit return false;:
class MyMiddleware { public function before($params) { if (isset($_SESSION['user']) === false) { return false; } // da es true ist, geht einfach alles weiter } }
Hier ist ein Beispiel, um den Benutzer auf eine Login-Seite umzuleiten:
class MyMiddleware { public function before($params) { if (isset($_SESSION['user']) === false) { Flight::redirect('/login'); exit; } } }
Angenommen, Sie müssen einen JSON-Fehler auslösen, weil Sie eine API erstellen. Sie können das so machen:
class MyMiddleware { public function before($params) { $authorization = Flight::request()->headers['Authorization']; if(empty($authorization)) { Flight::jsonHalt(['error' => 'Sie müssen angemeldet sein, um auf diese Seite zuzugreifen.'], 403); // oder Flight::json(['error' => 'Sie müssen angemeldet sein, um auf diese Seite zuzugreifen.'], 403); exit; // oder Flight::halt(403, json_encode(['error' => 'Sie müssen angemeldet sein, um auf diese Seite zuzugreifen.']); } } }
Sie können eine Routengruppe hinzufügen, und dann wird jede Route in dieser Gruppe auch dieselbe Middleware haben. Dies ist nützlich, wenn Sie beispielsweise eine Reihe von Routen nach einer Auth-Middleware gruppieren müssen, um den API-Schlüssel im Header zu überprüfen.
// am Ende der Gruppierungsmethode hinzugefügt Flight::group('/api', function() { // Diese "leer" aussehende Route passt tatsächlich zu /api Flight::route('', function() { echo 'api'; }, false, 'api'); // Dies passt zu /api/benutzer Flight::route('/users', function() { echo 'Benutzer'; }, false, 'benutzer'); // Dies passt zu /api/benutzer/1234 Flight::route('/users/@id', function($id) { echo 'Benutzer:'.$id; }, false, 'user_ansicht'); }, [ new ApiAuthMiddleware() ]);
Wenn Sie eine globale Middleware auf alle Ihre Routen anwenden möchten, können Sie eine "leere" Gruppe hinzufügen:
// am Ende der Gruppierungsmethode Flight::group('', function() { // Dies ist immer noch /benutzer Flight::route('/users', function() { echo 'Benutzer'; }, false, 'benutzer'); // Und das ist immer noch /benutzer/1234 Flight::route('/users/@id', function($id) { echo 'Benutzer:'.$id; }, false, 'user_ansicht'); }, [ new ApiAuthMiddleware() ]);