Newer
Older
salimkhr
a validé
# Le Pattern MVC
## Modèle-Vue-Contrôleur
salimkhr
a validé
## Problématique du développement web
### Le "Spaghetti Code"
- Code mélangé : logique et HTML dans les mêmes fichiers
- Manque de lisibilité
- Duplication importante
- Difficultés de maintenance
- Forte probabilité d'erreurs
salimkhr
a validé
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
## Problématique du développement web
### Solution : Le Pattern MVC
**Architecture de séparation des responsabilités**
- **M**odèle : Données et logique métier
- **V**ue : Affichage et présentation
- **C**ontrôleur : Coordination et orchestration
---
## Le Modèle
### Responsabilités
- Gère les données de l'application
- Contient la logique métier
- Valide les données selon les règles business
---
## La Vue
### Responsabilités
- Se consacre exclusivement à l'affichage
- Détermine **comment** présenter les données
- N'a aucune responsabilité sur **quoi** afficher
### Principe
La Vue reçoit des données et génère du HTML
---
## Le Contrôleur
### Responsabilités
- Réceptionne les requêtes utilisateur
- Orchestre le traitement des données
- Sélectionne la vue appropriée
### Rôle de coordinateur
Interface entre l'utilisateur et l'application
salimkhr
a validé
## Flux d'une requête MVC
1. Utilisateur → Requête HTTP
2. Point d'entrée → Instancie le contrôleur
3. Contrôleur → Sollicite le modèle
4. Modèle → Retourne les données
5. Contrôleur → Appelle la vue
6. Vue → Génère le HTML
7. Navigateur → Affiche la réponse
---
salimkhr
a validé
```[]
project_tp/
├── public/ ← Accessible par le navigateur
│ ├── index.php
│ └── article.php
├── app/
│ ├── controllers/ ← Contrôleurs
│ ├── views/ ← Templates
│ └── core/ ← Classes de base
└── config/
└── config.php
salimkhr
a validé
```txt[1|3|5|7|9|11|13]
app/
│
├── controllers/
│
├── entities/
│
├── repositories/
│
├── trait/
│
├── views/
│
└─ core/
```
---
### Arborescence du projet
#### /app/controllers
salimkhr
a validé
```php[1|3|5-12|14-19|22-24]
require_once '../app/core/Controller.php';
class HelloWorldController extends Controller
{
public function index():void
{
salimkhr
a validé
$this->view(
'hello_world',
'Titre',
['name' => 'Salim']
);
salimkhr
a validé
$this->json([
'title' => 'Titre',
'name' => 'Salim']
);
}
public function redirectToJson()
{
$this->redirectTo('/json.php');
}
}
```
---
### Arborescence du projet
#### /app/core/
salimkhr
a validé
```php[1|2|5-9|11-12|14-21|24-29|31-34]
abstract class Controller {
protected $viewPath = '../app/views/'; // Chemin vers les vues
salimkhr
a validé
protected function view(
string $viewName,
string $title = 'Titre de la page',
array $data = [],
$status = 200) {
salimkhr
a validé
$filePath = $this->viewPath .
$viewName . '.html.php';
if (file_exists($filePath)) {
// Extraire les données pour qu'elles soient disponibles dans la vue comme des variables
extract($data);
http_response_code($status);
require $filePath;
} else {
throw new Exception("Vue non trouvée : " . $filePath);
}
}
protected function json($data, $status = 200) {
header('Content-Type: application/json');
http_response_code($status);
echo json_encode($data);
exit();
}
protected function redirectTo($url) {
header("Location: $url");
exit();
}
}
```
---
salimkhr
a validé
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
### Arborescence du projet
#### /app/views
```php[]
public function index():void
{
$this->view(
'hello_world',
'Titre',
['article' => $article]
);
}
```
---
### Arborescence du projet
#### /app/views
```php[]
<h1><?= $article['title'] ?></h1>
<p>
<?= $article['content'] ?>
</p>
```
---
### Arborescence du projet
#### /app/views
```php[]
public function index():void
{
$this->view(
'hello_world',
'Titre',
['articles' => $articles, 'isAuthor' => true]
);
}
```
---
### Arborescence du projet
#### /app/views
```php[1|5|9]
<?php if ($isAuthor): ?>
<a href="article_create.php" class="btn">
Créer un article
</a>
<?php else: ?>
<p>
Seuls les auteurs peuvent créer des articles.
</p>
<?php endif; ?>
```
---
### Arborescence du projet
#### /app/views
```php[2-13|3|12]
<h2>Liste des articles</h2>
<ul class="articles-list">
<?php foreach ($articles as $article): ?>
<li>
<h3>
<a href="article.php?id=<?= $article['id'] ?>">
<?= $article['title'] ?>
</a>
</h3>
<p><?= substr($article['content'], 0, 100) ?>...</p>
</li>
<?php endforeach; ?>
</ul>
```
---
### Arborescence du projet
| Entities | Repositories |
|-------------------------------------------------------|---------------------------------------------------------------|
| /app/entities | /app/repositories |
| Classes représentant les tables de la base de données | Connexions à la base de données et exécution des requêtes SQL |
---
### Arborescence complète du projet :