Des fonctions sans nom

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

Notions abordées : Fonction anonymeTableau associatifisset()

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.

Votre mission

  1. Rangez la fabrication de la une dans une fonction anonyme, stockée dans une variable $une. Elle renvoie la page avec return Page::rendre(...), au lieu de l'afficher :

    $une = function (): string {
        // … $html comme avant …
        return Page::rendre('La Gazette de Saint-Glinglin', $html . '</main>');
    };
    
  2. Déclarez le tableau des pages du site, qui associe une adresse à la fonction qui la fabrique : $pages = ['/' => $une];.

  3. Retrouvez l'adresse demandée avec Url::cheminDemande(). Si elle est dans le tableau (isset()), appelez sa fonction et affichez ce qu'elle renvoie.

La une ne change pas. Une adresse inconnue, comme /nulle-part, affiche pour l'instant une page blanche : la page d'erreur viendra plus tard.

Pourquoi Url::cheminDemande() ?

L'adresse demandée est dans $_SERVER['REQUEST_URI'], mais pas toute seule. Dans l'aperçu de l'éditeur, la gazette est servie sous un préfixe (/preview/…), et un lien partagé sur LinkedIn ajoute ?utm_source=linkedin à la fin. Url::cheminDemande() retire les deux et ne garde que le chemin : /.

Rappel

Une fonction anonyme est une fonction sans nom, qu'on range dans une variable comme n'importe quelle valeur. On l'appelle avec des parenthèses après la variable : $une(). Comme elle est une valeur, elle peut aussi se ranger dans un tableau : $pages['/']() appelle la fonction de l'adresse /. isset() vérifie qu'une clé existe dans un tableau avant de s'en servir. Ce tableau d'adresses et de fonctions, c'est déjà un routeur, fait main.