Chapitre 5 du parcours Apprendre PHP 8

Chaque article a son adresse

9 exercices · 1 250 XP · environ 3 h

Ce chapitre fait travailler : composer requireDépendancevendor/Méthode statiqueSéparation des responsabilitésuseFonction anonymeTableau associatifisset()RouteurContrôleur frontalConstante de classe$_SERVERParamètre de routeLienMéthodeEnumfrom()Code HTTP404405http_response_codetryFrom()ExceptionthrowtrycatchHéritageextendsparent::Exception personnalisée

Les exercices du chapitre

  1. Installer un routeur

    Exercice 1 · 100 XP · 3 objectifs vérifiés par des tests

    La gazette n'a qu'une page, et Madame Lou voudrait que chaque article ait la sienne, avec son adresse : /articles/la-fete-de-la-citrouille. Pour faire correspondre une adresse à du code, il faut un routeur. On pourrait l'écrire soi-même, mais d'autres l'ont déjà très bien fait : FastRoute, de Nikita Popov, l'un des développeurs de PHP.

    composer requireDépendancevendor/

  2. La rédaction déménage

    Exercice 2 · 100 XP · 3 objectifs vérifiés par des tests

    Le neveu d'Odette a fait le ménage pendant la nuit. Les publications vivent maintenant dans src/Contenu/Redaction.php, et chaque article a reçu un slug, son nom dans les adresses : la-fete-de-la-citrouille. L'en-tête du journal, lui, est passé dans src/Web/Page.php. Il vous laisse un mot : « index.php n'a plus besoin de tout savoir. Il demande les publications à la rédaction, et la mise en page à Page. »

    Méthode statiqueSéparation des responsabilitésuse

  3. Des fonctions sans nom

    Exercice 3 · 150 XP · 5 objectifs vérifiés par des tests

    Madame Lou a de grands projets : une page par article, une page par rubrique, un formulaire pour les petites annonces… Toutes ces adresses arriveront dans le même public/index.php. Il lui faut donc un moyen de choisir quoi afficher selon l'adresse demandée. Avant d'appeler un outil à la rescousse, construisons-le à la main, avec des fonctions anonymes.

    Fonction anonymeTableau associatifisset()

  4. Le contrôleur frontal

    Exercice 4 · 150 XP · 5 objectifs vérifiés par des tests

    Votre tableau $pages marche, mais Madame Lou voit déjà plus loin : /articles/la-fete-de-la-citrouille, /articles/le-chat-du-maire-a-disparu… Une ligne par article, à la main, ce serait sans fin. Le routeur installé tout à l'heure, FastRoute, sait reconnaître des familles d'adresses. Pour l'instant, il va simplement remplacer votre tableau, sans rien changer à ce qu'affiche la une.

    RouteurContrôleur frontalConstante de classe$_SERVER

  5. Une page par article

    Exercice 5 · 150 XP · 4 objectifs vérifiés par des tests

    Sur la une, on ne lit que le début de chaque article. Les villageois veulent la suite ! Chaque article aura sa page, à l'adresse /articles/ suivie de son slug.

    Paramètre de routeLienMéthode

  6. Les rubriques en ligne

    Exercice 6 · 150 XP · 3 objectifs vérifiés par des tests

    Gaston ne lit que la météo, Odette que la fête du village. Chaque rubrique aura sa page : /rubriques/meteo, /rubriques/fete-du-village, /rubriques/faits-divers. Le nom dans l'adresse est la valeur de l'énumération Rubrique, celle que vous lui avez donnée au chapitre 2.

    Paramètre de routeEnumfrom()

  7. Le facteur l'a perdu

    Exercice 7 · 150 XP · 5 objectifs vérifiés par des tests

    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.

    Code HTTP404405http_response_codetryFrom()

  8. L'article introuvable

    Exercice 8 · 150 XP · 3 objectifs vérifiés par des tests

    Le neveu d'Odette prépare une page « Les articles de Gaston », et il a oublié de tester le null de Redaction::article(). Résultat : Call to a member function versHtmlComplet() on null, une erreur qui arrive loin de sa cause et ne dit pas ce qui manque. Chaque nouvel appel à Redaction::article() devra-t-il penser au null ? Non : quand l'article n'existe pas, Redaction::article() va lancer une exception, et le contrôleur frontal l'attrapera une fois pour toutes.

    Exceptionthrowtrycatch

  9. Une exception à son nom

    Exercice 9 · 150 XP · 4 objectifs vérifiés par des tests

    Le neveu d'Odette s'inquiète. Le contrôleur frontal attrape toutes les exceptions : le jour où la gazette aura une base de données et qu'elle tombera en panne, les lecteurs verront « Le facteur l'a perdu » au lieu d'une vraie erreur, et personne ne cherchera la panne. Il faut une exception à part, qui veut dire « cet article n'existe pas », et n'attraper qu'elle.

    Héritageextendsparent::Exception personnalisée