Fehlerfall

Bei ungültigen Requests seitens des Benutzers gilt es zu reagieren und eine entsprechende Fehler-Seite auszugeben.

  1. Http-Status ändern
  2. StatusException
  3. Benutzerdefinierte Status-Seite

Http-Status ändern

Möchtest du eine Fehlerseite ausgeben, kannst du über n2n\http\Response:setStatus() den HTTP-Status ändern.

class ExampleController extends ControllerAdapter {    
    
    // some methods
    
    public function notFound() {
        $this->getResponse()->setStatus(Response::STATUS_404_NOT_FOUND);
        
        $this->forward('view\notFound.html');
    }
}

StatusException

Im Fehlerfall ist es aber meistens sinnvoller und auch einfacher, eine n2n\http\StatusException zu werfen. Der n2n-ExceptionHandler gibt in diesem Fall eine konfigurierbare Fehler-Seite mit dem entsprechenden Status-Code aus. Dieser Exception kannst du im Konstruktor einen beliebigen Status-Code übergeben: new StatusException(Response::STATUS_404_NOT_FOUND);

Für die häufigsten Fehlerfälle sind aber bereits Exceptions vorbereitet, denen kein Status-Code mehr übergeben werden muss:

  • 404: n2n\http\PageNotFoundException
  • 403: n2n\http\ForbiddenException

Folgendes Beispiel zeigt, wie du eine n2n\http\PageNotFoundException anwenden könntest:

    public function doDetail($id, ArticleDao $articleDao) {
        $article = $articleDao->getArticleById($id);
        if ($article === null) {
            throw new PageNotFoundException();
        }
        
        $this->forward('view\detail.html', array('article' => $article));
    }
Wirfst du in einem Controller, in dem eine Methode notFound() implementiert ist, eine StatusException mit Status 404 (auch PageNotFoundException), so wird anstelle des ExceptionHandlers notFound() aufgerufen.

Benutzerdefinierte Status-Seite

Wird vom n2n-ExceptionHandler eine HttpStatusException gefangen, gibt er standardmässig die View n2n/view/errorpages/status.html aus. In der app.ini unter der Gruppe [error] kannst du aber für jeden HTTP-Status eine eigene View registrieren:

[error]

error_view.default = "atusch\view\status.html"
error_view.403 = "atusch\view\forbidden.html"
error_view.404 = "atusch\view\notFound.html"

Ist für einen Status keine View definiert, so wird  error_view.default verwendet.

Vorsicht beim Überschreiben der View für den Status 500. Dies solltest du nur für den Live-Modus machen, da du sonst auch die normale Exception-View überschreibst, die Informationen zu Exceptions anzeigt. Nutze hierzu die Gruppe [error : live].
« HTTP-Cache Requests delegieren »

comments_title

post_login_to_create

questions_title