Le facteur l'a perdu

Exercice 7 sur 9 du chapitre 5 · 150 XP · 5 objectifs vérifiés par des tests

Notions abordées : Code HTTP404405http_response_codetryFrom()

Léo, le petit-fils du maire, s'amuse à taper n'importe quoi dans la barre d'adresse : /articles/le-maire-a-gagne-au-loto, /rubriques/sport… La gazette lui répond par une page blanche, ou plante. Un vrai site répond « cette page n'existe pas », avec le code HTTP qui va avec, pour que les navigateurs et les moteurs de recherche le comprennent aussi.

Votre mission

  1. Ajoutez à Page, à côté de rendre(), une méthode statique introuvable(): string : elle fixe le code 404 avec http_response_code() et renvoie une page avec <main class="lecture">, le titre <h2>Le facteur l'a perdu</h2>, un mot d'excuse et un lien <a class="retour"> vers la une.

  2. Quand aucune route ne correspond, affichez cette page.

  3. Quand la route existe mais pas pour cette méthode (un POST sur la une), répondez 405 : $route[0] vaut alors Dispatcher::METHOD_NOT_ALLOWED. Un simple http_response_code(405); suffit, avec ou sans page.

  4. Un article ou une rubrique inconnus répondent aussi 404 :

    • pour un article inconnu, Redaction::article() renvoie null ;
    • pour une rubrique, remplacez Rubrique::from() par Rubrique::tryFrom(). Les deux méthodes existent sur toute énumération à valeurs, mais tryFrom('sport') renvoie null au lieu de planter.

    Dans les deux cas, testez le null et renvoyez la page introuvable :

    $rubrique = Rubrique::tryFrom($parametres['nom']);
    if ($rubrique === null) {
        return Page::introuvable();
    }
    

Rappel

Chaque réponse HTTP porte un code : 200 tout va bien, 404 introuvable, 405 méthode non autorisée, 500 erreur du serveur. http_response_code(404) le fixe. Il doit être appelé avant que la page soit envoyée : c'est pour cela que les gestionnaires renvoient le HTML au lieu de l'afficher, et que echo vient en dernier. Rubrique::from() lance une erreur pour une valeur inconnue, Rubrique::tryFrom() renvoie null : à vous de décider quoi faire.