Middleware
Middleware bietet die Möglichkeit, vor oder nach einer Controller-Methode auszuführende Logik in eigene Klassen auszulagern. Diese werden vom Framework zu einer verketteten Liste zusammengefügt, die vor dem Aufruf der Controller-Methode in der definierten Reihenfolge und anschließend in umgekehrter Reihenfolge durchlaufen wird. Exceptions können die Middleware-Kette unterbrechen.
Deklaration
Middleware liegt im Ordner app/Middleware
und erbt von der abstrakten Klasse RHRZ\Framework\Middleware
. Es muss lediglich die Methode invoke
implementiert werden, die eine Response zurückgibt. Optional kann ein Konstruktor definiert werden, der Parameter entgegennimmt.
Mit dem Aufruf von $this->next()
wird die nächste Middleware in der Kette ausgeführt. Davor und danach kann eigene Logik eingefügt werden (siehe Kommentare).
namespace App\Middleware;
use RHRZ\Framework\Middleware;
use RHRZ\Framework\Response;
class Example extends Middleware
{
protected string $param;
public function __construct(string $param)
{
$this->param = $param;
}
public function invoke(): Response
{
// before ...
$response = $this->next();
// after ...
return $response;
}
}
Nutzung
Middleware kann an verschiedenen Stellen des Projekts eingebunden werden.
Kernels
Middleware, die bei jedem Request ausgeführt werden soll, wird in den Kernels in der Methode appendMiddleware()
eingetragen.
protected function appendMiddleware(): array
{
return [
\App\Middleware\Example::class,
];
}
Controller
Middleware, die für alle Routen eines gesamten Controllers ausgeführt werden soll, wird mit dem Attribut Middleware
unmittelbar über diesem angegeben. Dem Attribut kann neben dem Klassennamen der Middleware eine beliebige Anzahl optionaler Parameter übergeben werden, welche an die Methode invoke
weitergereicht werden.
#[Middleware(Example::class, 'param')]
class ProductController extends Controller
{
// ...
}
Controller-Methode
Middleware, die für alle Routen einer bestimmten Controller-Methode ausgeführt werden soll, wird ebenfalls mit dem Attribut Middleware
angegeben, jedoch unmittelbar über der jeweiligen Methode.
#[Route(HTTP::GET, 'products/:id/edit')]
#[Middleware(Example::class, 'param')]
public function edit($id)
{
// ...
}
Core-Middleware
In den Core-Kernels sind bereits einige Middleware-Klassen eingebunden, die grundlegende Funktionalität für das Framework enthalten. Bei Bedarf kann Core-Middleware durch die Methode coreMiddleware
der Kernels überschrieben werden.
todo
Beschreibung der Core-Middleware