La carte complète des actions
Les formulaires HTML comprennent directement GET et POST. Nous utilisons donc des chemins explicites pour modifier et supprimer, sans ajouter de mécanisme caché de remplacement de méthode.
Les routes
src/routes/WebApp.php
$this->get('/books', [BookController::class, 'index']);
$this->get('/books/create', [BookController::class, 'create']);
$this->post('/books', [BookController::class, 'store']);
$this->get('/books/{id}/edit', [BookController::class, 'edit']);
$this->post('/books/{id}/edit', [BookController::class, 'update']);
$this->post('/books/{id}/delete', [BookController::class, 'destroy']);Retrouver un identifiant dynamique
public function edit(Request $request): Response
{
$id = (int) $request->attribute('id');
$books = $this->session->get('books', []);
$book = $this->findBook($books, $id);
if ($book === null) {
return Response::html('<h1>404</h1><p>Book not found.</p>', 404);
}
return $this->view('books/edit.php', [
'book' => $book,
'errors' => [],
]);
}Le routeur extrait la partie {id} de l’adresse et la place dans les attributs de Request. Le cast int empêche de traiter cet identifiant comme un texte arbitraire.
Chercher sans dupliquer la boucle
/** @param list<array{id:int,title:string,author:string}> $books */
private function findBook(array $books, int $id): ?array
{
foreach ($books as $book) {
if ($book['id'] === $id) {
return $book;
}
}
return null;
}Cette méthode privée ne répond pas au navigateur. Elle aide simplement plusieurs actions du contrôleur à retrouver un livre. Au prochain chapitre, la base de données et un dépôt remplaceront cette recherche en session.
Les livres appartiennent ici à un seul navigateur et peuvent disparaître lorsque la session expire. C’est suffisant pour apprendre HTTP; ce n’est pas encore un stockage de production.