Fehlerbehandlung in Extbase-Plugins

HTTP-Statuscodes nutzen und (kritische) Fehler anwenderfreundlich ausgeben

TYPO3 erlaubt es einem auf einfache Art und Weise einzustellen, wie auf nicht gefundene und nicht verfügbare Seiten reagiert wird. So lässt sich im TYPO3 Install-Tool beispielsweise mit der Option pageUnavailable_handling der HTTP-Header einstellen, der im Fall einer nicht gefundenen Seite an den Client geschickt wird. Mit der Option pageNotFound_handling ist es zudem möglich, den Benutzer auf eine beliebige Seite umzuleiten, den Inhalt einer Datei auszugeben oder gar eigenen Code auszuführen, wenn eine Seite nicht gefunden wird.
Auf diese bereits bestehenden Funktionen kann man auch in einer Extbase-Extension zurückgreifen, um im Fehlerfall ansprechende Fehlerseiten und -Meldungen auszugeben.

Die Hauptzutaten für unser Vorhaben finden wir in der Klasse TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController:

  • pageNotFoundAndExit: Diese Methode ruft den Page-Not-Found Handler von TYPO3 auf.
  • pageUnavailableAndExit: Diese Methode ruft den Page-Unavailable Handler von TYPO3 auf.

Um alle Exceptions in unserem Extbase-Plugin abzufangen und entsprechend auf sie zu reagieren, schreiben wir einen abstrakten Action Controller, der diese Aufgabe übernimmt, und leiten alle konkreten Controller-Implementierungen von diesem ab.

Eine mögliche Implementierung des besagten Action Controllers sieht wie folgt aus:

Und das macht das gute Stück:

  • Kann der Property Mapper eine angeforderte Entität nicht finden (z.B. weil der Datensatz ausgeblendet oder gelöscht wurde), wird der TYPO3 Page-not-Found Handler aufgerufen.
  • Wird in unserem Plugin eine \TYPO3\CMS\Core\Error\Http\PageNotFoundException geworfen, wird ebenfalls der TYPO3 Page-not-Found Handler aufgerufen. Das ermöglicht es uns in den konkreten Controller-Implementierungen auf einfache Weise 404-Fehler an den Client zu melden.
  • Bei allen anderen Exceptions, die innerhalb unseres Plugins geworfen werden, wird abhängig davon, ob das Typoscript-Setting usePageUnavailableHandler den Wert 1 (wahr) oder 0 (falsch) hat, entweder der TYPO3 Page-not-Available Handler aufgerufen oder eine Fehlermeldung, die besagt, dass ein Unbekannter Fehler aufgetreten ist, statt der eigentlichen Ausgabe unseres Plugins ausgegeben. In beiden Fällen wird der HTTP-Status-Code 500 (Internal Server Error) an den Client geschickt.

5 Gedanken zu „Fehlerbehandlung in Extbase-Plugins

  1. Finmike (1 comments)

    Endlich mal ein Lösungsansatz für ein allgemeines Problem, was gar nicht so einfach zu googlen geht. Frage vom noch-nicht-ganz-nerd bzw. noob: Wie rufe ich das jetzt auf, so aus der showAction meines ObjectControllers?

    Auf jeden Fall vielen Dank für die Anregung.

  2. Thorsten Boock (3 comments) Artikelautor

    Hi Finmike,
    was genau meinst du?
    Wenn du den Code aus diesem Post in deinen Controller kopierst
    - werden Exceptions, die in deinem Code auftreten automatisch abgefangen
    - erhälst du die Möglichkeit, selber eine \TYPO3\CMS\Core\Error\Http\PageNotFoundException zu werfen und dadurch den TYPO3 Page-not-Found Handler auszulösen

  3. Fritzthecat (1 comments)

    Coole Sache. Nur wie kann ich das ganze jetzt in eine eigene Klasse packen, um es in mehreren Controllern aufrufen zu können? Hast du eventuell einen Tipp für mich?

  4. Thorsten Boock (3 comments) Artikelautor

    @Fritzthecat
    Den Code kannst du in eine Klasse kopieren (hier im Beispiel heißt sie ActionController) und dann alle anderen Controller von dieser ableiten.

Kommentare sind geschlossen.