Vous êtes sur la page 1sur 13

OFPPT Office de la Formation Professionnelle

et de la Promotion du Travail
Filière : DD TC
Module :Sites web dynamiques
Formation : Initiale TP : MVC

1. Introduire le MVC :

MVC est l'acronyme de "Modèle-Vue-Contrôleur" (Model-View-Controller en anglais). C'est un modèle


d'architecture logicielle couramment utilisé pour concevoir des applications web. Le but du MVC est de séparer les
différentes responsabilités de l'application en trois composants distincts : le modèle, la vue et le contrôleur. Cela
permet d'améliorer la maintenabilité, la réutilisabilité et la testabilité du code.
Voici une description de chaque composant du modèle MVC :
1. Modèle (Model) : Le modèle représente les données de l'application et contient la logique métier. Il est
responsable de la manipulation, de la validation et du traitement des données. Il communique généralement avec
la base de données ou d'autres sources de données pour récupérer et enregistrer les informations.
2. Vue (View) : La vue est responsable de l'affichage des données et de l'interface utilisateur. Elle présente les
informations au format approprié pour les utilisateurs. La vue ne doit contenir que la logique nécessaire à
l'affichage des données et ne doit pas manipuler les données directement.
3. Contrôleur (Controller) : Le contrôleur gère les interactions entre le modèle et la vue. Il reçoit les demandes de
l'utilisateur, traite les actions appropriées et met à jour le modèle en conséquence. Il récupère également les
données nécessaires du modèle et les transmet à la vue pour l'affichage. Le contrôleur joue un rôle de médiateur
entre le modèle et la vue.

En utilisant le modèle MVC, vous séparez les préoccupations et maintenez une meilleure organisation du code.
Cela facilite la compréhension, la modification et l'extension de l'application. Par exemple, si vous souhaitez
modifier l'interface utilisateur, vous pouvez le faire sans toucher au modèle ou à la logique métier.
Chaque composant du modèle MVC a un rôle spécifique et interagit avec les autres de manière structurée. Cette
séparation des responsabilités permet de développer des applications évolutives, maintenables et testables.
2. Exemple pratique en PHP :
Dans cet exemple nous allons créer une app MVC pour le gestion d’une ressource Etablissement
(id,nom,ville,adresse).

a. Structure du projet :
b. Database.php :
<?php
class Database {
private $host = 'localhost';
private $db_name = 'tp_mvc';
private $username = 'root';
private $password = '';
private $conn;
public function connect() {
$this->conn = null;
try {
$this->conn = new PDO('mysql:host=' . $this->host . ';dbname=' . $this-
>db_name, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo 'Erreur de connexion à la base de données : ' . $e->getMessage();
}
return $this->conn;
}
}

c. Le model:
<?php
require_once 'database.php';
class Etablissement {
private $id;
private $nom;
private $ville;
private $adresse;
// Constructeur
public function __construct($id, $nom, $ville, $adresse) {
$this->id = $id;
$this->nom = $nom;
$this->ville = $ville;
$this->adresse = $adresse;
}
// Getters
public function getId() {
return $this->id;
}

public function getNom() {


return $this->nom;
}

public function getVille() {


return $this->ville;
}

public function getAdresse() {


return $this->adresse;
}

// Setters
public function setId($id) {
$this->id = $id;
}

public function setNom($nom) {


$this->nom = $nom;
}

public function setVille($ville) {


$this->ville = $ville;
}

public function setAdresse($adresse) {


$this->adresse = $adresse;
}
//methode d'acces a la base de donnee CRUD:
public static function getAll() {
$db = (new Database())->connect();
$stmt = $db->query('SELECT * FROM etablissements');
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

public static function getById($id) {


$db = (new Database())->connect();
$stmt = $db->prepare('SELECT * FROM etablissements WHERE id = ?');
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}

public static function create($nom, $ville, $adresse) {


$db = (new Database())->connect();
$stmt = $db->prepare('INSERT INTO etablissements (nom, ville, adresse)
VALUES (?, ?, ?)');
$stmt->execute([$nom, $ville, $adresse]);
return $db->lastInsertId();
}

public static function update($id, $nom, $ville, $adresse) {


$db = (new Database())->connect();
$stmt = $db->prepare('UPDATE etablissements SET nom = ?, ville = ?, adresse
= ? WHERE id = ?');
return $stmt->execute([$nom, $ville, $adresse, $id]);
}

public static function delete($id) {


$db = (new Database())->connect();
$stmt = $db->prepare('DELETE FROM etablissements WHERE id = ?');
return $stmt->execute([$id]);
}
}

d. Le contrôleur :
Un contrôleur est une classe qui gère les actions et les interactions entre les modèles (données) et les vues (affichage). Il est

responsable de la logique métier de l'application et prend en charge le traitement des demandes utilisateur.

<?php
class EtablissementController {
// Action index pour afficher la liste
public function index() {
$etablissements = Etablissement::getAll();
// Charge la vue index.php avec les données $etablissements
require 'views/etablissement/index.php';
}
public function create() {
// Afficher la vue contenant le formulaire d'ajout
require 'views/etablissement/create.php';
}
public function store() {
// Ajouter un etab a la bd
$nom = htmlspecialchars($_POST['nom']);
$ville = htmlspecialchars($_POST['ville']);
$adresse = htmlspecialchars($_POST['adresse']);
// Effectuer d'autres validations et vérifications ici
$id = Etablissement::create($nom, $ville, $adresse);
// Redirige vers la page index
header('Location: index.php');
exit();
}

public function edit($id) {


//Afficer le formulaire pour modifier un etab
$etablissement = Etablissement::getById($id);
// Charge la vue edit.php avec les données $etablissement
require 'views/etablissement/edit.php';
}
public function update($id) {
//Enregistrer les modification dans la bd
$nom = htmlspecialchars($_POST['nom']);
$ville = htmlspecialchars($_POST['ville']);
$adresse = htmlspecialchars($_POST['adresse']);
// Effectuer d'autres validations et vérifications ici
$success = Etablissement::update($id, $nom, $ville, $adresse);
// Redirige vers la page index
header('Location: index.php');
exit();
}
public function delete($id) {
$success = Etablissement::delete($id);
header('Location: index.php');
exit();
}
}
e. Les vues :
Views/etablissement/Index.php :

<!DOCTYPE html>
<html>

<head>
<title>Liste des établissements</title>
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css">
</head>

<body>
<div class="container">
<h3>Gestion des établissements</h3>
<a href="index.php?action=create" class="btn btn-primary">Ajouter un
établissement</a>
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>Nom</th>
<th>Ville</th>
<th>Adresse</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php foreach ($etablissements as $etablissement) { ?>
<tr>
<td><?php echo $etablissement['id']; ?></td>
<td><?php echo $etablissement['nom']; ?></td>
<td><?php echo $etablissement['ville']; ?></td>
<td><?php echo $etablissement['adresse']; ?></td>
<td>
<a href="index.php?action=edit&id=<?php echo $etablissement['id']; ?>"
class="btn btn-primary">Modifier</a>
<a href="#" class="btn btn-danger" onclick="confirmDelete(<?php echo
$etablissement['id']; ?>)">Supprimer</a>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
<script>
function confirmDelete(id) {
if (confirm("Êtes-vous sûr de vouloir supprimer cet établissement ?")) {
window.location.href = "index.php?action=delete&id=" + id;
}
}
</script>
</body>

</html>
Views/etablissement/create.php :
<!DOCTYPE html>
<html>

<head>
<title>Ajouter un établissement</title>
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css">
</head>

<body>
<div class="container">
<h1>Ajouter un établissement</h1>
<form method="post" action="index.php?action=store">
<div class="mb-3">
<label for="nom" class="form-label">Nom</label>
<input type="text" class="form-control" id="nom" name="nom" required>
</div>
<div class="mb-3">
<label for="ville" class="form-label">Ville</label>
<input type="text" class="form-control" id="ville" name="ville" required>
</div>
<div class="mb-3">
<label for="adresse" class="form-label">Adresse</label>
<input type="text" class="form-control" id="adresse" name="adresse" required>
</div>
<button type="submit" class="btn btn-primary">Ajouter</button>
</form>
</div>
</body>

</html>
Views/etablissement/edit.php:
<!DOCTYPE html>
<html>

<head>
<title>Modifier un établissement</title>
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css">
</head>

<body>
<div class="container">
<h1>Modifier un établissement</h1>
<form method="post" action="index.php?action=update&id=<?php echo
$etablissement['id']; ?>">
<div class="mb-3">
<label for="nom" class="form-label">Nom</label>
<input type="text" class="form-control" id="nom" name="nom" value="<?php echo
$etablissement['nom']; ?>" required>
</div>
<div class="mb-3">
<label for="ville" class="form-label">Ville</label>
<input type="text" class="form-control" id="ville" name="ville" value="<?php
echo $etablissement['ville']; ?>"
required>
</div>
<div class="mb-3">
<label for="adresse" class="form-label">Adresse</label>
<input type="text" class="form-control" id="adresse" name="adresse" value="<?php
echo $etablissement['adresse']; ?>"
required>
</div>
<button type="submit" class="btn btn-primary">Modifier</button>
</form>
</div>
</body>

</html>
f. Index.php:
Le fichier index.php joue le rôle principal de point d'entrée de votre application. Il sert de routeur pour diriger les
requêtes vers les actions appropriées du contrôleur correspondant.

<?php
// Inclure le contrôleur et le modèle
require_once 'controllers/EtablissementController.php';
require_once 'models/Etablissement.php';

// Vérifier l'URL demandée


$action = isset($_GET['action']) ? $_GET['action'] : 'index';

// Instancier le contrôleur
$controller = new EtablissementController();

// Router vers l'action appropriée


switch ($action) {
case 'index':
$controller->index();
break;
case 'create':
$controller->create();
break;
case 'store':
$controller->store();
break;
case 'edit':
$id = isset($_GET['id']) ? $_GET['id'] : null;
$controller->edit($id);
break;
case 'update':
$id = isset($_GET['id']) ? $_GET['id'] : null;
$controller->update($id);
break;
case 'delete':
$id = isset($_GET['id']) ? $_GET['id'] : null;
$controller->delete($id);
break;
default:
// Action par défaut si aucune correspondance trouvée
echo 'Page non trouvée';
}

Vous aimerez peut-être aussi