Sie sind auf Seite 1von 7

COMPRENDRE LE PATTERN MVC AVEC UN EXEMPLE

SIMPLE
15 mars 2012 par Mathieu dans Dveloppement web
0
inShare
0
Le pattern MVC est le concept la mode en matire de programmation avec interface graphique, et notamment en dveloppement web.
Symfony, Zend et tous les grands frameworks dont la renomme nest plus faire lutilisent. Et ce nest pas pour rien.
Peut-tre lavez-vous toujours utilis ? Peut-tre voulez-vous vous y mettre timidement ou peut-tre vous demandez-vous encore si
cest bien la peine puisque vos applications en PHP classique fonctionnent trs bien.
Avant toute chose, je tiens noter que mes propos sont largement inspirs par la documentation et les exemples
de Symfony, produite par la fabuleuse quipe de Fabien Potencier. Ce billet servira sans doute dintroduction un petit
tutoriel maccompagnant dans la (re)dcouverte de Symfony2.
Ce quest le MVC et ce quil nest pas
Tout dabord, MVC est lacronyme de Model View Controller . En franais Modle Vue Controlleur : on a du bol, cela
commence par les mmes lettres.
Le MVC nest pas une technologie sortie des laboratoires de la NASA et na pas besoin dune configuration serveur diffrente de celle
que vous possder actuellement. Il nexiste donc pas de module php-mvc installer via apt-get
Le MVC ne va pas non plus rendre vos applications plus rapides, efficaces ou hype . Le MVC ne rendra pas votre site plus attrayant
ou davantage promis la gloire.
Par contre, il rendra votre application facilement maintenable, acclrera considrablement vos dveloppement futurs et, lorsque vous
regarderez votre code, vous rendra fier den tre lauteur (ou alors, cest que vous tes vraiment mauvais).
Ok, soit. Mais en quoi cela consiste vritablement ?
Je ne vais pas commencer par vous expliquer chaque terme de Modle Vue Contrleur , mais plutt partir dun petit exemple en
PHP classique.
Si, comme moi, vous pratiquez ce langage depuis plusieurs annes, vous avez probablement ralis des pages, extrmement rapides
crire, qui comportaient la fois des instructions de connexion une base de donnes, des rcuprations de donnes partir de cette
base, et laffichage de celles-ci dans un petit canevas HTML.
Cest facile et cela pourrait donner quelque chose comme cela, dans le cadre dune page affichant des articles de blog:
?
1
2
<?php
$con = mysql_connect('localhost', 'kershin', 'blabla45');
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql_select_db('my_db', $con);

$query = "SELECT id, title, date_create FROM entry";
$res = mysql_query($query);
?>

<html>
<head>
<title>Entres de blog rcentes</title>
</head>
<body>
<h1>Les posts rcents:</h1>
<ul>
<?php while($r = mysql_fetch_object($result)) { ?>
<li>
<a href="/read.php?id=<?php echo $r->id; ?>">
<?php echo $r->title; ?>
</a>
</li>
<?php } ?>
</ul>
</body>
</html>

<?php
mysql_close($con);
?>
Votre application fonctionne ds lors trs bien, mais:
1. Il ny a aucun contrle derreur (quid si la DB est HS ?)
2. Lorganisation laisse dsirer.
3. Il est quasiment impossible de rutiliser le code ailleurs.
Comment pourrait-on amliorer cela ? La philosophie du MVC a suivi le cheminement suivant:
1. Isoler la partie visuelle
La premire chose qui vient lesprit pour organiser un tant soit peu votre application est de sparer le code PHP du code HTML. Les
soupes, cest super pour la sant et cest plein de vitamines, mais en programmation, mieux vaut ne pas en abuser. De plus, cela
permettra de favoriser la rutilisation du code PHP et du template html.
Pour cela, il faut arrter de dcortiquer le resultset de la base de donnes au sein mme du template.
Tout simplement parce que votre liste darticles ne viendra pas toujours forcment de la DB, mais pourra venir dun flux RSS, dun
fichier ou de nimporte quelle source que nous pourrions imaginer.
Bien sr, nous aurons toujours un peu de PHP dans notre template pour tout ce qui est affichage de variables, boucles et ventuellement
structures alternatives, mais nous devons limiter celui-ci au strict minimum et, surtout, faire en sorte quil soit le plus gnrique
possible.
Cest ce que nous faisons ici, en modifiant quelque peu notre code et en dplaant la partie HTML dans un autre fichier que nous
appellerons list.php (celui-ci sera plac dans un dossier templates ). Examinons les 2 fichiers:
Le fichier index.php contenant votre code PHP:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// index.php

<?php
$con = mysql_connect('localhost', 'kershin', 'blabla45');
mysql_select_db('my_db', $con);

$query = "SELECT id, title, date_create FROM entry";
$res = mysql_query($query);

$posts = array();
while($r = mysql_fetch_object($res))
$posts[] = $r;

mysql_close($con);
?>
Le fichier list.php contenant le html:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title>Entres de blog rcentes</title>
</head>
<body>
<h1>Les posts rcents:</h1>
<ul>
<?php foreach($posts as $post): ?>
<li>
<a href="/read.php?id=<?php echo $post->id; ?>">
<?php echo $post->title; ?>
</a>
</li>
<?php endforeach ?>
</ul>
</body>
</html>
Bravo, vous venez de crer un contrleur, personnifi par le fichier index.php ! Certes, pas encore trs efficace, mais au moins il ne
contient plus que du code PHP. Tout le ct programmation est maintenant isol dans celui-ci. Il y a du mieux.
Pour rsumer: le contrleur est le fichier qui rceptionne les demandes du client (linternaute), traite les donnes et lui retourne une
rponse valable.
Votre contrleur nest, comme je lai dit plus haut, pas encore trs efficace. Car si vous souhaitez maintenant crer une autre page, vous
ne pouvez pas rutiliser index.php car il contient toute une srie de traitements dont vous naurez pas besoin dans cette autre page.
Et nous navons pas envie de nous amuser avec des switch nest-ce-pas ?
2. Isoler les mthodes daccs aux donnes.
Admettons que notre deuxime page soit une page daffichage dun billet de blog en particulier, identifi par son id. Il faut que celle-ci
puisse accder aux mthodes de connexion la base et de fermeture de connexion. Sans bien videmment devoir copier-coller
compltement toute une partie du code de la page index.php . Ce serait idiot !
Vous imaginez si, par la suite, vous devez rajouter une instruction dans le processus de connexion la DB ? Il faudra vous repalucher
lensemble de vos pages et, inlassablement, appuyer sur CTRL-V au mme endroit.
Epargnons-nous cela et sortons tout ce qui a trait la DB de notre contrleur. Pour cela, nous crerons un nouveau fichier appel
model.php qui ressemblera plus ou moins ceci:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// model.php

function db_open_connexion() {
$con = mysql_connect('localhost', 'kershin', 'blabla45');
mysql_select_db('my_db', $con);
return $con;
}

function db_close_connexion($con) {
mysql_close($con);
}

function get_posts() {
$con = db_open_connexion();
$query = "SELECT id, title, date_create FROM entry";
$res = mysql_query($query, $con);

$posts = array();
while($r = mysql_fetch_object($res))
$posts[] = $r;

db_close_connexion($con);
return $posts;
}
Suite cela, notre fichier index.php (le contrleur) devient:
?
1
2
3
4
5
// index.php

require_once 'model.php';
$posts = get_posts();
require 'templates/list.php';
Il faut avouer que cest dj vachement mieux ! Ok: index.php ne servira toujours que pour afficher la liste des billets de blog, mais au
moins il ne contient plus de code qui pourrait tre ncessit par une autre page. Et cela, cest vraiment bien !
La seule chose dans notre application qui ne peut pas tre rutilise, cest la mise en page. Par exemple, tout ce qui ne concerne pas
directement laffichage de la liste des billets est sans doute commune tout votre site. La balise html, head, body, etc, toutes ces choses
qui, pour linstant, doivent galement tre copies-colles dune page lautre.
Donc, notre prochaine mission consistera :
3. Isoler la mise en page.
Pour cela, nous allons sparer notre code html en 2 fichiers distincts: un fichier de mise en page gnrale (layout.php) et un fichier bien
spcifiquement li laffichage de notre liste de billets de blog.
Tout dabord, voyons le fichier layout.php :
?
1
2
3
4
5
6
7
8
<html>
<head>
<title><?php echo $title ?></title>
</head>
<body>
<?php echo $content ?>
</body>
</html>
Et ensuite, le fichier templates/list.php que nous simplifierons ainsi:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php $title = "Liste de billets de blog" ?>
<?php ob_start() ?>
<h1>Les posts rcents:</h1>
<ul>
<?php foreach($posts as $post): ?>
<li>
<a href="/read.php?id=<?php echo $post->id; ?>">
<?php echo $post->title; ?>
</a>
</li>
<?php endforeach ?>
</ul>
<?php $content = $ob_get_clean() ?>

<?php include 'layout.php' ?>
4. Aller plus loin.
Maintenant, notre code html peut tre rutilis facilement.
Pour prouver cela, nous allons crer la page dont nous parlions plus haut: la page read.php qui permettra de visionner le contenu
dun article de blog en particulier, identifi par son id.
Afin de rcuprer ces infos, nous avons besoin de rajouter une mthode dans notre fichier model.php . Cette fonction permettra de
rcuprer les informations concernant le billet en lui passant un simple id:
?
1
2
3
4
5
6
7
8
// model.php

function get_post_details_by_id($id) {
$con = db_open_connexion();
$id = mysql_real_escape_string($id);
$query = "SELECT title, date, body FROM post WHERE id = $id";
$res = mysql_query($query);
$r = mysql_fetch_object($res);

9
10
11
12
db_close_connexion($con);
return $r;
}
Maintenant, nous devons crer un nouveau contrleur pour la nouvelle page. Nous le nommerons read.php et il se rsumera ces
quelques lignes:
?
1
2
3
4
5
6
// read.php

<?php
require_once 'model.php';
$post = get_post_details_by_id($_GET['id']);
require 'templates/read.php';
Il sagit tout fait de la mme manire de fonctionner que pour index.php .
Il ne nous reste ds lors plus qu crer le template html de notre nouvelle page (templates/read.php), lequel appellera lui aussi notre
template gnral layout.php :
?
1
2
3
4
5
6
7
8
9
10
11
<?php $title = $post->title ?>

<?php ob_start() ?>
<h1><?php echo $post->title ?></h1>
<div class="post-date"><?php echo $post->date ?></div>
<div class="post-body">
<?php echo $post->body ?>
</div>
<?php $content = $ob_get_clean() ?>

<?php include 'layout.php' ?>
5. Lide du front controller.
Un front controller ? Ksako ? Jai dj des contrleurs, pourquoi en rajouter un ?
Ce principe nest pas proprement parler inhrent au pattern MVC, mais il sagit plutt dune extension de celui-ci, utilise par
Symfony entre autres. Il permet de rsoudre des problmes ou des complications qui pourraient subvenir.
Par exemple, vous avez remarqu que le fichier model.php est inclus dans chacun de vos contrleurs. Que se passerait-il maintenant
si vous devient inclure un 2me fichier, un 3me ? Vous devriez manuellement diter tous vos contrleurs ! Au risque den oublier un.
Quel ennui !
La solution ce problme est lutilisation dun contrleur unique qui appellera certaines actions en fonction de lurl appele.
Transformons notre fichier index.php comme ceci:
?
1
2
3
4
// index.php

<?php
require_once 'model.php';
require_once 'controllers.php';
5
6
7
8
9
10
11
12
13
14
15

$uri = $_SERVER['REQUEST_URI'];
if($uri == '/index.php') {
list_action();
} elseif($uri == '/index.php/read' && isset($_GET['id']) {
read_action($_GET['id']);
} else {
header('Status: 404 Not Found');
echo '<html><body><h1>Page non trouve</h1></body></html>';
}
Nos anciens contrleurs index.php et read.php deviennent donc maintenant des fonctions qui sont places dans le fichier
controllers.php appel par le contrleur frontal. Comme ceci:
?
1
2
3
4
5
6
7
8
9
function list_action() {
$posts = get_posts();
require 'templates/list.php';
}

function read_action($id) {
$post = get_post_details_by_id($id);
require 'templates/read.php';
}
Dornavant, toutes les pages de votre site pourront tre appeles suivant le format www.site.com/index.php/read ou
www.site.com/index.php/contact, etc.
Ce qui, avec laide des rewrite rules dApache, deviendra facilement simplement www.site.com/read ou www.site.com/contact .
Donc, en rsum, il faut retenir que le contrleur (Controller) est la partie de votre application qui rceptionne les demandes, traite les
infos et retourne les rponses correctes.
Le modle (Model) est reprsente par tout ce qui a trait laccs, la modification et la suppression des donnes. Cest linterface
entre le contrleur et la base de donne.
Et la vue, cest le systme de templates que le contrleur appelle pour mettre en forme les donnes reues par le modle. Vu comme a,
ce nest pas si compliqu !
Cette prsentation rapide du pattern MVC devrait vous avoir aid mieux comprendre son intrt, du moins je lespre. Ensuite, des
frameworks comme Symfony permettent den simplifier encore lemploi.
Mais cela fera lobjet dun autre billet Peut-tre
Si vous avez aim cet article ou si vous souhaitez y apporter une nuance ou signaler une erreur, merci de laisser un petit commentaire.
N'oubliez pas galement de vous abonner au RSS feed pour recevoir en primeur les derniers articles publis.
Tags: mvc, symfony, tutoriel

Das könnte Ihnen auch gefallen