Extbase-Controller und PSR-7 Responses in TYPO3 11

Seit TYPO3 v11 gilt eine klare Regel: jede Action in einem Extbase-Controller muss ein PSR-7 Response-Objekt zurückgeben. Früher war es möglich, null, einen String oder sogar Objekte, die zu einem String gecastet werden konnten, zurückzugeben – das ist jetzt Vergangenheit.

Warum diese Änderung?

Das Ziel war eindeutig:

  • PSR-Standards konsequent einführen,
  • weniger „Magie“ hinter den Kulissen,
  • Controllercode präziser und nachvollziehbarer gestalten.

Dadurch haben wir als Entwickler:innen die volle Kontrolle über das, was eine Action an den Browser zurückliefert.

Neue Werkzeuge im ActionController

Um die Arbeit zu erleichtern, wurde im Core eine Abhängigkeit zu PSR-17 eingeführt:

  • ResponseFactoryInterface – erstellt Response-Objekte
  • StreamFactoryInterface – erstellt Stream-Objekte für den Response-Body

Beide Interfaces sind Teil der PSR-17-Spezifikation. Damit lassen sich eigene Responses sehr flexibel bauen.

Beispiel: statische Antwort

                            public function staticAction(): ResponseInterface
{
   return $this->responseFactory->createResponse()
       ->withAddedHeader('Content-Type', 'text/html; charset=utf-8')
       ->withBody($this->streamFactory->createStream('Mein statischer Text'));
}
                        

Helfer: htmlResponse() und jsonResponse()

Da die meisten Actions ohnehin ein Fluid-Template rendern, stellt Extbase praktische Methoden bereit:

                            protected function htmlResponse(string $html = null): ResponseInterface
{
    return $this->responseFactory->createResponse()
        ->withHeader('Content-Type', 'text/html; charset=utf-8')
        ->withBody($this->streamFactory->createStream(
            $html ?? $this->view->render()
        ));
}

protected function jsonResponse(string $json = null): ResponseInterface
{
    return $this->responseFactory->createResponse()
        ->withHeader('Content-Type', 'application/json; charset=utf-8')
        ->withBody($this->streamFactory->createStream(
            $json ?? $this->view->render()
        ));
}
                        

Migration bestehender Actions

Meist genügt es, am Ende einer Action htmlResponse() oder jsonResponse() zurückzugeben.

                            public function listAction(): ResponseInterface
{
    $this->view->assign('items', $this->findItems());
    return $this->htmlResponse();
}
                        

Fazit

Mit TYPO3 11 ist die Rückgabe von PSR-7 kompatiblen Responses Pflicht. Der Umstieg ist jedoch in den meisten Fällen unkompliziert – und der Gewinn an Flexibilität ist enorm: Wir können ab sofort jede beliebige Response erzeugen, von klassischem HTML bis hin zu JSON-APIs oder sogar Datei-Downloads.

Link zu den offiziellen Patch-/Deprecation-Infos: TYPO3 Doku

PHP TYPO3