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.
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 demresponse
enthaltene Content gezählt und ein sich daraus ergebenerContent-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/
Danke für diese Einleitung in dieses Thema!!!
Pingback: TYPO3 v9 ist da › Qblog
Pingback: PHP die dynamische Konstante › Qblog