Le contrôleur frontal

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

Notions abordées : RouteurContrôleur frontalConstante de classe$_SERVER

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.

Votre mission

  1. Créez le routeur avec FastRoute\simpleDispatcher(). La fonction que vous lui passez reçoit un RouteCollector (déjà importé en haut du fichier : c'est l'API de FastRoute 1.3, la version installée). Elle y déclare la route GET /, avec la fonction de la une comme gestionnaire.
  2. Demandez au routeur quelle route correspond à la requête : sa méthode ($_SERVER['REQUEST_METHOD']) et son chemin (Url::cheminDemande()).
  3. Si une route est trouvée, affichez ce que renvoie son gestionnaire. Le tableau $pages et le isset() disparaissent.

De votre tableau au routeur

Chaque ligne de votre routeur fait main a son équivalent. Avant :

$pages = ['/' => $une];

$chemin = Url::cheminDemande();
if (isset($pages[$chemin])) {
    echo $pages[$chemin]();
}

Après :

$routeur = FastRoute\simpleDispatcher(function (RouteCollector $routes) {
    $routes->get('/', function (): string {
        // … le corps de $une, sans rien changer …
    });
});

$route = $routeur->dispatch($_SERVER['REQUEST_METHOD'], Url::cheminDemande());
if ($route[0] === Dispatcher::FOUND) {
    $gestionnaire = $route[1];
    echo $gestionnaire($route[2]);
}

FastRoute\simpleDispatcher() est une fonction rangée dans l'espace de noms FastRoute : on l'appelle par son nom complet, sans use.

dispatch() renvoie un tableau : en [0], le résultat (Dispatcher::FOUND si une route correspond), en [1] le gestionnaire, en [2] les morceaux variables de l'adresse, vides pour la une. Le routeur tient aussi compte de la méthode : GET pour lire une page, POST pour envoyer un formulaire.

Rappel

Dispatcher::FOUND est une constante de classe : une valeur fixe, rangée dans la classe Dispatcher, qu'on lit avec ::. public/index.php reçoit toutes les adresses du site et confie au routeur le soin de choisir la page : c'est le contrôleur frontal.