TP01 : Réorganisation et évolution d’une application PHP (MVC)
- Durée : 4 heures
- Technologie : PHP natif + MySQL
- Contraintes : pas de framework, architecture MVC imposée.
- JalonXX : indique une validation à faire auprès de Mme Thevenot avant de passer à la suite du travail
Contexte et objectif
Voici une application PHP non structurée en MVC de gestion d'une bibliothèque. Cette application permet :
- d’ajouter des livres dans une base de données
- d’afficher la liste des livres existants.
Votre mission est de :
- Réorganiser cette application en respectant le modèle MVC (Modèle / Vue / Contrôleur).
- Implémenter une évolution spécifique de l’application (attribuée à chaque étudiant).
- Travail complémentaire : utiliser des classes
Ressources fournies
- Fichier bibliotheque.php (code initial)
- Script SQL bibliotheque.sql pour créer la base
Partie 1 – Application de départ
Le fichier fourni bibliotheque.php contient tout le code (HTML, PHP et SQL).
Note: Le fichier bibliotheque.php est à enregistrer dans le dossier local de votre serveur LAMP (à installer selon le modèle de l'an dernier en transposant sous votre système Windows), dans un dossier D3-A01BibliMVC - Ce dossier devra être synchronisé avec un dépôt du même nom dans votre gitea.
- bibliotheque.php
<?php $ip = 'localhost'; $user = 'adminBibli'; $pass = 'mdpBibli'; $database = 'bdbibliotheque'; // Définition de la source des données pour PDO $dsn = "mysql:host=$ip;dbname=$database;charset=utf8mb4"; // Création de l'objet $dbh, de type PDO, qui est la ressource d'accès à la base try { $db = new PDO($dsn, $user, $pass); } catch (PDOException $e) { die("Erreur de connexion : ".$e->getMessage()); } // Ajout d’un livre if (!empty($_POST['titre']) && !empty($_POST['auteur']) && !empty($_POST['annee'])) { $stmt = $db->prepare("INSERT INTO livres (titre, auteur, annee) VALUES (?, ?, ?)"); $stmt->execute([$_POST['titre'], $_POST['auteur'], $_POST['annee']]); } // Récupération des livres $stmt = $db->query("SELECT * FROM livres"); $livres = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <title>Bibliothèque</title> </head> <body> <h1>Gestion de la bibliothèque</h1> <form method="POST"> <label>Titre : <input type="text" name="titre"></label><br> <label>Auteur : <input type="text" name="auteur"></label><br> <label>Année : <input type="number" name="annee"></label><br> <button type="submit">Ajouter</button> </form> <h2>Liste des livres</h2> <ul> <?php foreach ($livres as $livre): ?> <li><?= $livre['titre'] ?> - <?= $livre['auteur'] ?> (<?= $livre['annee'] ?>)</li> <?php endforeach; ?> </ul> </body> </html>
Partie 2 – Objectif
Jalon0 : Tester la version initiale non organisée selon le modèle MVC
Réorganiser ce code en respectant le schéma MVC :
- Modèle : gestion des livres et accès BDD.
- Contrôleur : réception des actions (ajouter, lister, etc.), le contrôleur appelle les fonctions du modèle et charge la vue correspondante.
- Vues : uniquement du HTML + affichage, les vues sont séparées
- à la racine le fichier index.php est la page d'accueil qui sert de routeur (choix de l’action → appel du contrôleur).
Jalon1 : Proposer une arborescence avec les fichiers et leur rôle précis
Coder et vérifier que l’application fonctionne toujours avec deux fonctionnalités de base :
- Ajouter un livre
- Afficher la liste des livres
Jalon2 : Validation du fonctionnement de l'application initiale en respectant le modèle MVC
Partie 3 – Évolutions
Chaque étudiant implémente une évolution en respectant le MVC.
Chaque évolution doit impliquer :
- une modification du modèle
- une adaptation du contrôleur
- une mise à jour de la vue
- Étudiant 1 – Suppression d’un livre (Morgann)
- Ajouter un bouton Supprimer dans la liste des livres.
- Implémenter la méthode de suppression dans le modèle.
- Étudiant 2 – Recherche de livres (Medhi)
- Ajouter un champ de recherche (titre/auteur).
- Implémenter une méthode de recherche dans le modèle.
- Afficher uniquement les résultats correspondants.
- Étudiant 3 – Gestion des catégories (Steve)
- Créer une table categories(id, nom).
- Associer chaque livre à une catégorie.
- Adapter le formulaire et l’affichage.
- Étudiant 4 – Modification d’un livre (Salomé)
- Ajouter un bouton Modifier dans la liste des livres.
- Permettre l’édition et la sauvegarde des informations du livre.
- Étudiant 5 - Gestion du statut d’un livre (emprunté / disponible) (Emile)
- ajouter un champ statut dans la table livres (par défaut “disponible”).
- affichage du statut dans la liste + bouton “Emprunter” ou “Rendre”.
- action changerStatut qui met à jour le champ.
Attention: L'application avec votre évolution sera le sujet de la revue de code de lundi, elle devra donc être terminée pour lundi 15/09 14h
Partie 4 – Evolution du code
- utilisation d'un header.php et footer.php pour limiter les redondances de code
- utilisation de classes :
- LivreControleur avec 2 méthodes au départ : ajouterLivre() et listerLivres()
- Livre avec les méthodes getAll() et ajouter($titre, $auteur, $annee)
- Database avec la méthode connexionDB()