TYPO3 9 404 aus Extensions heraus


in früheren Version von TYPO3 konnte man einfach folgenden Code nutzen damit ein entsprechender 404 geworfen wird.

$GLOBALS['TSFE']->pageNotFoundAndExit('text');

Mit TYP3 9 wird folgendes empfohlen:

            return GeneralUtility::makeInstance(ErrorController::class)->pageNotFoundAction(
                $this->request,
                'The requested page does not exist',
                ['code' => PageAccessFailureReasons::PAGE_NOT_FOUND]
            );

Ich nutze es nun immer in Zusammenhang mit einer DetailAnsicht welche meist auf einer eigenen Unterseite der Listen Ansicht, in folgender Art und Weise:

  public function detailAction(MyObject $event = null)
  {
      if ($event === null) {
            $this->handleContentNotFound();
        }
   ...
 }



/** 
     * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException
     * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException
     */
    public function handleContentNotFound()
    {
        $isThereAnEventId = $this->request->hasArgument('event');

        if ($isThereAnEventId === true) {
            return GeneralUtility::makeInstance(ErrorController::class)->pageNotFoundAction(
                $this->request,
                'The requested page does not exist',
                ['code' => PageAccessFailureReasons::PAGE_NOT_FOUND]
            );
        }
        $parentPageUrl = $this->uriBuilder
            ->setTargetPageUid($this->getTypoScriptFrontendController()->page['pid'])
            ->setCreateAbsoluteUri(true)
            ->build();
        $this->redirectToUri($parentPageUrl, 0, 301);
    }

In der detailAction wird zuerst geprüft ob das injecten des Objectes NICHT erfolgreich war, also weiterhin null ist.
Wenn dem der Fall ist geht es weiter zu „handleContentNotFound()“.
Dort wird geschaut, ob mit dem request überhaupt eine Anfrage nach einer SingleView gestellt wurde, also ob eine, in meinem Fall „event“ Variable mit übergeben wurde. Wenn dem so ist, existiert das Event nicht oder ist bereits abgelaufen. Ansonsten gehen wir davon aus, das die nur die DetailSeite aufgerufen wurde und diesen Aufruf leiten wir mit einem 301 auf die übergeordnete Seite, also die Listenansicht weiter.