La page /books doit devenir un vrai point de départ.
- Afficher tous les livres de la session.
- Proposer un lien Ajouter un livre.
- Proposer Modifier et Supprimer pour chaque livre.
- Conserver les valeurs invalides et afficher les erreurs.
- Rediriger après chaque changement réussi.
Action index()
public function index(Request $request): Response
{
return $this->view('books/index.php', [
'books' => $this->session->get('books', []),
]);
}Vue de la liste
src/views/books/index.php
<h1>Mes livres</h1>
<p><a href="/books/create">Ajouter un livre</a></p>
<?php if ($books === []): ?>
<p>Aucun livre pour le moment.</p>
<?php else: ?>
<ul>
<?php foreach ($books as $book): ?>
<li>
<strong><?= $view->escape($book['title']) ?></strong>
— <?= $view->escape($book['author']) ?>
<a href="/books/<?= (int) $book['id'] ?>/edit">Modifier</a>
<form method="post" action="/books/<?= (int) $book['id'] ?>/delete">
<?= $view->csrfField() ?>
<button type="submit">Supprimer</button>
</form>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>Action de suppression
public function destroy(Request $request): Response
{
$id = (int) $request->attribute('id');
$books = $this->session->get('books', []);
$books = array_values(array_filter(
$books,
static fn (array $book): bool => $book['id'] !== $id,
));
$this->session->set('books', $books);
return Response::redirect('/books', 303);
}array_filter conserve les livres dont l’identifiant est différent. array_values remet les positions du tableau dans un ordre simple. L’identifiant métier du livre, lui, ne change pas.
Plan de vérification
aml routes
aml testCe que vous avez réellement appris
Vous n’avez pas seulement créé un formulaire. Vous avez séparé consultation et modification, lu une requête, validé ses valeurs, protégé une action, conservé un état entre plusieurs requêtes, choisi des statuts HTTP utiles et empêché la répétition d’un POST.
EN RÉSUMÉ
Ce qu’il faut retenir
- Le navigateur aide, mais le serveur valide toujours.
- csrfField() protège chaque formulaire de modification.
- La vue échappe toute valeur dynamique.
- Une redirection 303 termine proprement un POST.
- La session convient à l’apprentissage, pas à la persistance définitive.