Skip to content

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 implemen­tiert 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).

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

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

php
#[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.

php
#[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