Session BRE04 Help

Projet de soutien: MVC à trous

Étape 1 : repository Git et base de données

Étape 1.1 : le repository

Sur votre compte GitHub créez un nouveau repository que vous appelerez bre04-soutien-mvc-books.

Clonez ce repository sur votre IDE.

Étape 1.2 : la base de données

Dans votre PHPMyAdmin créez une base de données que vous appelerez prenomnom_soutien_mvc_books.

Étape 1.3 : la table books

Dans cette base de données vous allez créer une table books qui a 4 colonnes :

  • id (int autoincrémenté et votre clé primaire)

  • title (varchar 255)

  • author (varchar 127)

  • description (varchar 255)

Étape 1.4 : remplir la table

Vous allez ensuite insérer à la main depuis PHPMyAdmin les livres suivants dans votre table

  1. 1984 – George Orwell Un homme lutte contre un régime totalitaire oppressant, où la surveillance, la pensée unique et la répression dominent toute la société.

  2. Hunger Games – Suzanne Collins Katniss participe à un jeu mortel organisé par un gouvernement autoritaire, défiant l’ordre établi pour survivre et protéger les siens.

  3. Notre-Dame de Paris – Victor Hugo Quasimodo, son amour pour Esmeralda, et le destin tragique de personnages prisonniers des conventions sociales et religieuses du Moyen Âge.

Étape 2 : les fichiers du projet

Récupérez les fichiers du projet :

soutien-27-06-2025.zip

Dézippez-les et placez les dossiers et fichiers dans le dossier de votre projet sur votre IDE.

Parcourez les fichiers, la structure devrait vous être familière 😊

Étape 3 : remplir le modèle

Dans le dossier models vous trouverez un fichier Book.php qui contient une classe Book qui pour le moment est vide.

Vous allez devoir remplir ce fichier pour faire correspondre votre class Book à la table books que vous avez créée dans la base de données.

N'oubliez pas que l'id doit pouvoir être null et qu'il est null par défaut.

<?php class Book { public function __construct(private string $title, private string $author, private string $description, private ? int $id = null) { } public function getId(): ?int { return $this->id; } public function setId(?int $id): void { $this->id = $id; } public function getTitle(): string { return $this->title; } public function setTitle(string $title): void { $this->title = $title; } public function getAuthor(): string { return $this->author; } public function setAuthor(string $author): void { $this->author = $author; } public function getDescription(): string { return $this->description; } public function setDescription(string $description): void { $this->description = $description; } }

Étape 4 : remplir la méthode findAll du Manager

Dans le dossier managers vous allez commencer par mettre les bonnes informations de connexion à votre base de données dans le fichier AbstractManager.php.

Ensuite, dans le fichier BookManager.php, vous allez compléter la méthode findAll de la classe BookManager. Cette méthode doit vous retourner un tableau d'instances de la classe Book qui contient tous les livres présents dans la base de données.

public function findAll() : array { $query = $this->db->prepare('SELECT * FROM books'); $parameters = []; $query->execute($parameters); $books = []; $result = $query->fetchAll(PDO::FETCH_ASSOC); foreach ($result as $item) { $book = new Book($item["title"], $item["author"], $item["description"], $item["id"]); $books[] = $book; } return $books; }

Étape 5 : remplir la méthode list du controller

Dans le dossier controllers vous trouverez un fichier BookController.php qui contient une classe BookController.

Vous allez devoir compléter la méthode list du BookController. Elle va devoir appeler le BookManager et l'utiliser pour récupérer un tableau de tous les livres présents dans la base de données.

public function list() : void { $books = $this->manager->findAll(); $template = "books/list-book"; require "templates/layout.phtml"; }

Étape 6 : dynamiser la liste des livres

Dans le dossier templates/books vous trouverez un fichier list-book.phtml qui contient du code en dur qui affiche une liste de livres, Vous allez devoir dynamiser ce code de façon à ce qu'il utilise le tableau récupéré dans le controller pour afficher la liste des livres présents dans la base de données.

<main class="p-5"> <h1 class="text-center">Liste des livres</h1> <section class="row g-4 py-5"> <?php foreach ($books as $book): ?> <div class="col-6 col-sm-4 col-md-3"> <article class="card p-4"> <h2 class="card-title"><?= $book->getTitle(); ?></h2> <h3 class="card-subtitle mb-2 text-body-secondary"><?= $book->getAuthor(); ?></h3> <p class="card-text"><?= $book->getDescription(); ?></p> </article> </div> <?php endforeach; ?> </section> </main>

Étape 7 : remplir la méthode create du Manager

Dans le fichier managers/BookManager.php vous allez compléter la méthode create de la classe BookManager. Cette méthode reçoit une instance de la classe Book et doit la sauvegarder dans la base de données. Elle doit retourner cette instance de classe avec l'id qui lui a été attribué par la base de données.

public function create(Book $book) : Book { $query = $this->db->prepare("INSERT INTO books (id, title, author, description) VALUES (NULL, :title, :author, :description)"); $parameters = [ 'title' => $book->getTitle(), 'author' => $book->getAuthor(), 'description' => $book->getDescription(), ]; $query->execute($parameters); $id = $this->db->lastInsertId(); $book->setId($id); return $book; }

Étape 8 : remplir la méthode checkCreate du controller

Dans le fichier controllers/BookController.php vous allez devoir compléter la méthode checkCreate de la classe BookController.

Cette méthode va devoir récupérer les données en voyer par le formulaire pour instancier une classe Book. Elle devra transmettre cette instance de classe à la méthode create du BookManager.

Elle redirige ensuite vers la page de liste des livres (la redirection est déjà faite pour vous).

public function checkCreate() : void { if(isset($_POST["title"]) && isset($_POST["author"]) && isset($_POST["description"])){ $book = new Book($_POST["title"], $_POST["author"], $_POST["description"]); $book = $this->manager->create($book); } header('Location: index.php'); }

Correction complète

Correction complète

27 June 2025