Madame Lou veut retoucher la page « Le facteur l'a perdu », mais son HTML est noyé dans des concaténations : '<p><a class="retour" href="' . Url::vers('/') . '">'… Un gabarit (template en anglais) inverse les rôles : c'est un fichier de HTML, avec juste ce qu'il faut de PHP pour y glisser les valeurs. Il faut d'abord l'outil qui les remplit : une classe Vue.
Votre mission
- Écrivez
Vue::rendre($gabarit, $variables)danssrc/Web/Vue.php: elle exécute le fichiertemplates/<gabarit>.php, où chaque clé de$variablesest devenue une variable, et renvoie le HTML produit, sans l'afficher. - Écrivez
templates/introuvable.php: le HTML de la page « Le facteur l'a perdu » (<main class="lecture">, le titre, le mot d'excuse, le lien retour), avec<?= Url::vers('/') ?>pour l'adresse de la une. Page::introuvable()prend son contenu dans ce gabarit :Vue::rendre('introuvable').
À quoi ressemble un gabarit
<?php use Gazette\Web\Url; ?> <main class="lecture"> <h2>Le facteur l'a perdu</h2> <p><a class="retour" href="<?= Url::vers('/') ?>">← Retour à la une</a></p> </main>
<?= … ?> est le raccourci de <?php echo …; ?> : il affiche une valeur au milieu du HTML. Tout ce qui est hors des balises PHP est affiché tel quel. Le gabarit est un fichier à part : les use de Vue.php ne s'y appliquent pas, il déclare lui-même use Gazette\Web\Url; sur sa première ligne.
Rappel
Pour écrire Vue::rendre(), trois outils :
requireexécute un fichier PHP à l'endroit où il est appelé. Le gabarit voit donc les variables de la méthode qui le charge. Son chemin se construit à partir du fichier courant avec__DIR__, comme pourvendor/autoload.php.extract(['article' => $a])crée une variable par clé du tableau : ici$article, qui vaut$a.ob_start()met de côté tout ce qui est affiché à partir de là, etob_get_clean()le rend sous forme de chaîne (et arrête de mettre de côté). C'est ainsi qu'unrequirequi affiche du HTML devient une méthode qui le renvoie.
ob_get_clean() peut aussi renvoyer false en cas de problème. (string) devant une valeur la convertit en chaîne, comme (int) la convertit en entier : return (string) ob_get_clean(); respecte le type string annoncé.