Documentation · Chapitre 04

Construire un formulaire
compréhensible.

Avant de traiter des données, construisons une page accessible où chaque étiquette, nom et type a une fonction précise.

Nous poursuivons le projet reading-list. Les données seront conservées dans la session avant d’introduire une base de données.

Ajoutez la route qui affiche le formulaire

src/routes/WebApp.php

phpaml — zsh
use App\Controllers\BookController;

// Dans routes():
$this->get('/books/create', [BookController::class, 'create']);

Cette route n’enregistre encore rien. Elle demande seulement à BookController d’afficher le formulaire.

Ajoutez l’action create()

src/controllers/BookController.php

phpaml — zsh
public function create(Request $request): Response
{
    return $this->view('books/create.php', [
        'errors' => [],
        'old' => ['title' => '', 'author' => ''],
    ]);
}

Nous transmettons déjà errors et old, même vides. La vue conservera ainsi la même forme lorsqu’une validation échouera plus tard.

Créez le fichier de vue

src/views/books/create.php

phpaml — zsh
<!DOCTYPE html>
<html lang="fr">
<head><meta charset="UTF-8"><title>Ajouter un livre</title></head>
<body>
<main>
    <h1>Ajouter un livre</h1>
    <form method="post" action="/books">
        <?= $view->csrfField() ?>

        <label for="title">Titre</label>
        <input id="title" name="title" type="text" required
               value="<?= $view->escape($old['title'] ?? '') ?>">

        <label for="author">Auteur</label>
        <input id="author" name="author" type="text" required
               value="<?= $view->escape($old['author'] ?? '') ?>">

        <button type="submit">Enregistrer</button>
    </form>
</main>
</body>
</html>

Lisez la balise form

method=postenvoie une requête POST
action=/bookschoisit l’adresse destinataire
name=titlecrée la clé title dans la requête
requiredaide le navigateur, sans remplacer le serveur
$view->csrfField()ajoute le jeton de protection
Vérifiez votre compréhension : Pourquoi required ne suffit-il pas ?

Parce qu’un client peut contourner les règles du navigateur et envoyer directement une requête. Le serveur doit toujours valider lui-même.