Gewürztes für TYPO3: PSR-15 Middlewares in Version 9

Quelle: https://pixabay.com/de/zwiebel-rote-zwiebel-roh-2699531/

Qbus-Entwickler Benjamin Franzke hat in Zusammenarbeit mit dem TYPO3 Core Entwickler Benni Mack einen PSR-15-Middleware-Support für TYPO3 entwickelt. Die Implementation wird Teil der Version TYPO3 9.2 sein und damit auch in TYPO3 9.5 LTS zur Verfügung stehen.

PSR-15 Middlewares – Ein PHP-Standard

PSR Standards entstehen in der PHP Framework Interop Group (PHP-FIG) – einem Zusammenschluss verschiedener Entwickler von PHP Frameworks oder Applikationen mit einem gewissen Verbreitungsgrad.

Das Konzept einer Middleware wurde im Web durch das Node.js-Framework Express populär und hat dann auch Einzug in verschiedene PHP-Frameworks gehalten. Es wurde durch die PHP-FIG standardisiert um Middlewares als PHP-Komponenten in verschiedenen Frameworks verwenden zu können.

Was genau macht eine Middleware?

Wenn ein Browser eine Webseite von einem Server abruft, geschieht dies mit Hilfe des HTTP- bzw. HTTPS-Protokolls. Die Anfrage an den Server wird als request gesendet, der Server verarbeitet die Anfrage und liefert ein Ergebnis als response.

Eine Middleware klinkt sich sowohl in den request als auch den response rein und erlaubt es, diese zu manipulieren.

Dabei kann man verschiedene Middleware-Komponenten stapeln bzw. aneinander ketten, so dass sie sich wie Zwiebelschalen um den eigentlichen Verarbeitungskern der Anfrage legen.

Konzept einer Middleware Quelle: https://www.slimframework.com/docs/v3/concepts/middleware.html

Beispiele für Einsatzmöglichkeiten einer Middleware

Nomalerweise muss ein Nutzer in einer Webanwendung angemeldet sein. Das bedeutet, dass bei jedem Aufruf geprüft werden muss, ob der Nutzer angemeldet ist und demnach die angeforderte Seite aufrufen darf.

Diese Zugangs- und Rechteprüfung ist ein gutes Beispiel für den Einsatz einer Middleware. Durch sie kann diese Prüfung in einer zentralen Anwendungskomponente, nämlich in einer Authentication Middleware, zusammengefast werden.

Die Middleware fängt des request ab, prüft, ob der Nutzer die Erlaubnis hat. Wenn ja, wird der request an die nachfolgenden Middlewares und schließlich den eigentlichen Verarbeitungskern der Anwendung weiter gegeben, der den response generiert.

Ist der Nutzer nicht autorisiert, generiert die Middleware eine response-Umleitung auf die Login-Seite der Anwendung.

Weitere Beispiele insbesondere aus dem TYPO3-Umfeld wären:

  • Middleware zum Setzen des Content-Length headers: nach dem Aufruf aller (inneren) Middlewares wird der in dem response enthaltene Content gezählt und ein sich daraus ergebener Content-Length Header dem Request hinzugefügt.
  • Redirects: Eine Redirect Middleware prüft ob für die aktuelle Anfrage ein Redirect hinterlegt wurde und generiert in dem Fall eine response mit einem Redirect – der Aufruf weiterer Middlerwares wird dabei durch die Middleware unterbunden
  • Ein üblicher Anwendungsfall: Integration einer API Schnittstelle. Die API wird als Middleware implementiert, die prüft ob die REQUEST_URI mit /api/ beginnt und verarbeitet die Anfrage (z. B. über ein separates Routing Framework wie SLIM).
    Für Anfragen die nicht mit /api/ beginnen leitet diese Middleware die Anfrage einfach an die nächste Middleware weiter ohne selbst Veränderungen durchzuführen.

PSR-15 Middlewares – Wie verwende ich sie in TYPO3?

In TYPO3 werden jeweils für das Abfangen des request und des response unterschiedliche Middleware-Komponenten als PHP-Klassen angelegt und in einer Konfiguration registriert.

In einer Extension werden die Middlewares in der Datei Configuration/RequestMiddlewares.php registriert:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
/**
* Definitions for middlewares provided by EXT:example
*/
return [
    'frontend' => [
        'qbus/example/dosomething' => [
            'target' => \Qbus\Example\Middleware\DoSomething::class,
            'after' => [
                'typo3/cms-redirects/redirecthandler'
            ]
        ],
    ],
];

Die Middleware selbst wird in Classes/Middleware/DoSomething.php umgesetzt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
declare(strict_types = 1);
namespace Qbus\Example\Middleware;
 
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
 
class DoSomething implements MiddlewareInterface
{
    public function process(
        ServerRequestInterface $request,
        RequestHandlerInterface $handler
    ): ResponseInterface {
        // Invoke inner middlewares and eventually the TYPO3 kernel
        $response = $handler->handle($request);
 
	// Set caching header for cache servers (like NGINX) in seconds
        $response = $response->withHeader('X-Accel-Expires', 60);
 
        return $response;
    }
}

Mit dem nun eingeführten Konzept der Middlewares wird ein weiteres, sehr modernes Konzept einer modularen Software-Architektur in TYPO3 eingeführt.

Wie die obigen Beispiele zeigen, existiert durch die Middlewares nun auch ein offiziell unterstützter Weg, APIs auf REST Basis in TYPO3 umzusetzen. Damit wird es leichter möglich, externe Softwaredienste in TYPO3-Projekte einzubinden.

https://typo3.org/community/teams/typo3-development/initiatives/initiative-psr-15/

Schreibe einen Kommentar

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