Ajoutez la route qui affiche le formulaire
src/routes/WebApp.php
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
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
<!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.