0% ont trouvé ce document utile (0 vote)
91 vues4 pages

Cours L2 PHP MVC

Le modèle MVC (Modèle-Vue-Contrôleur) permet de séparer les différentes couches d'une application pour faciliter le travail en équipe. Il se compose de trois éléments principaux : le modèle qui gère la logique métier et les données, la vue qui présente les informations à l'utilisateur, et le contrôleur qui traite les requêtes et coordonne les interactions entre le modèle et la vue. L'architecture MVC est particulièrement adaptée aux applications web, même si des ajustements peuvent être nécessaires pour des langages comme PHP qui ne sont pas orientés objet.

Transféré par

brayjuanico
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
91 vues4 pages

Cours L2 PHP MVC

Le modèle MVC (Modèle-Vue-Contrôleur) permet de séparer les différentes couches d'une application pour faciliter le travail en équipe. Il se compose de trois éléments principaux : le modèle qui gère la logique métier et les données, la vue qui présente les informations à l'utilisateur, et le contrôleur qui traite les requêtes et coordonne les interactions entre le modèle et la vue. L'architecture MVC est particulièrement adaptée aux applications web, même si des ajustements peuvent être nécessaires pour des langages comme PHP qui ne sont pas orientés objet.

Transféré par

brayjuanico
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 4

LE MODELE MVC Modèle MVC global :

I. Principe du modèle MVC

Le but de MVC est de séparer les couches d'une


application (en 3 couches distinctes, au minimum,
et le plus souvent) , de manière à ce que plusieurs
groupes de personnes puissent travailler chacun
sur une couche, indépendamment des autres. On
va donc distinguer :

1. Le modèle qui encapsule la logique métier


et la manipulation des sources de données
2. La vue : présente les données au client les
demandant (un utilisateur humain ou un
autre programme). ( en HTML, XML, PDF ,
TemplateView, par exemple )
3. Le contrôleur : c'est tout le reste, c'est lui
qui analyse la requête du client, accède aux
données, formate le tout et l'envoie à la
partie vue qui va présenter tout ça.
Diagramme de séquence d'un MVC simple :
Il est très important de noter que la vue ne fait que
présenter des données et à aucun moment elle ne
connait leur provenance. C'est le modèle qui va
fournir toutes les méthodes nécessaires à la
récupération, et le contrôleur qui se chargera de
cette récupération et de sa transformation
éventuelle afin de coller à la vue.
Du coté du modèle, il est très important que celui-
ci ne connaisse ni les contrôleurs, ni les vues. Les
liens vont des contrôleurs vers le modèle, de temps
en temps, des vues vers le modèle, mais jamais
dans le sens inverse.
Il est possible que la vue accède au modèle. C'est
un choix architectural qui devra être bien réfléchi,
car il impose un plus fort couplage et un mélange
des couches. On appelle ça l'approche pull. C'est
souvent réservé aux opérations légères, comme
par exemple afficher une liste de catégories
d'éléments quelconques ; et aux opérations de
lecture uniquement. Le contrôleur est le composant principal du
L'approche inverse, appelée push, interdit à la vue modèle MVC. Il agit avec le modèle, la vue et
d'accéder au modèle. En général, on utilise les 2 d'autres contrôleurs tout à la fois.
choix en même temps : une instruction de lecture Quel qu'il soit, le contrôleur reçoit et analyse la
simple (récupérer la liste des membres) sera requête du client, accède au modèle, et présente la
demandée directement par la vue. vue.
En revanche une opération de modification du
modèle, sera demandée par un contrôleur. II. Utiliser l'architecture MVC dans les
applications Web/PHP

Le modèle MVC (Modèle-Vue-Contrôleur) cherche


à séparer nettement les couches présentation,
traitement et accès aux données. Une application
web respectant ce modèle sera architecturée de la
façon suivante :

1
L'architecture MVC est bien adaptée à des
applications web écrites avec des langages
orientés objet. Le langage PHP (4.x) n'est pas
orienté objet. On peut néanmoins faire un effort de
structuration du code et de l'architecture de
l'application afin de se rapprocher du modèle
MVC :

• On mettra la logique métier de l'application


dans des modules séparés des modules
chargés de contrôler le dialogue demande-
Le traitement d'une demande d'un client se déroule réponse. L'architecture MVC devient la
selon les étapes suivantes : suivante :

1. Le client fait une demande au contrôleur.


Ce contrôleur voit passer toutes les
demandes des clients. C'est la porte
d'entrée de l'application. C'est le C de MVC.
2. Le contrôleur traite cette demande. Pour ce
faire, il peut avoir besoin de l'aide de la
couche métier, ce qu'on appelle le modèle
M dans la structure MVC.
3. Le contrôleur reçoit une réponse de la
couche métier. La demande du client a été
traitée. Celle-ci peut appeler plusieurs
réponses possibles. Un exemple classique
est
• Une page d'erreurs si la demande n'a pu
être traitée correctement
• Une page de confirmation sinon
4. Le contrôleur choisit la réponse (= vue) à
envoyer au client. Celle-ci est le plus
souvent une page contenant des éléments
dynamiques. Le contrôleur fournit ceux-ci à
la vue. les classes métier, les classes
5. La vue est envoyée au client. C'est le V de M=modèle d'accès aux données et la base de
MVC. données
V=vues les pages PHP
Une telle architecture est souvent appelée
le script PHP de traitement des
"architecture 3-tier" ou à 3 niveaux.
C=contrôleur requêtes clientes, les scripts PHP
[Action] de traitement des actions.
L'interface utilisateur est souvent un navigateur
web mais cela pourrait être également une Dans le bloc [Logique Applicative], on pourra
application autonome qui via le réseau enverrait distinguer :
des requêtes HTTP au service web et mettrait en
forme les résultats que celui-ci lui envoie. La • Le programme principal ou contrôleur
logique applicative est constituée des scripts [main.php], qui est la porte d'entrée de
traitant les demandes de l'utilisateur, des classes l'application.
métier et d'accès aux données. La source de • Le bloc [Actions], ensemble de scripts PHP
données est souvent une base de données mais chargés d'exécuter les actions demandées
cela peut être aussi de simples fichiers plats, un par l'utilisateur.
annuaire LDAP, un service web distant,... Le • Le bloc [Classes métier] qui regroupe les
développeur a intérêt à maintenir une grande modules PHP nécessaires à la logique de
indépendance entre ces trois entités afin que si l'application. Ils sont indépendants du client.
l'une d'elles change, les deux autres n'aient pas à Par exemple, la fonction permettant de
changer ou peu. calculer un impôt à partir de certaines
informations qui lui sont fournies en
paramètres, n'a pas à se soucier de la
façon dont ont été acquises celles-ci.
2
• Le bloc [Classes d'accès aux données] qui $comment_req = mysql_query("SELECT *
regroupe les modules PHP qui obtiennent FROM commentaires WHERE
les données nécessaires au contrôleur, news_id='$news_id'");
souvent des données persistantes (BD, $nbre_comment =
fichiers, ...) mysql_num_rows($comment_req);
• Les générateurs [pagex.php] des vues ?>
envoyées comme réponse au client. <h3><?php echo $nbre_comment ?>
commentaires relatifs à cette nouvelle</h3>
Dans les cas les plus simples, la logique <?php while ($comment =
applicative est souvent réduite à deux modules : mysql_fetch_array($comment_req)) {?>
<h3><?php echo $comment['auteur'] ?> a
• Le module [contrôle] assurant le dialogue écrit le <?php echo $comment['date'] ?></h3>
client-serveur : traitement de la requête, <p><?php echo $comment['texte'] ?></p>
génération des diverses réponses <?php } ?>
• Le module [métier] qui reçoit du module <form method="POST" action="<?php echo
[contrôle] des données à traiter et lui fournit $_SERVER['PHP_SELF'] ?>"
en retour des résultats. Ce module [métier] name="ajoutcomment">
gère alors lui-même l'accès aux données. <input type="hidden" name="news_id"
value="<?php echo $news_id?>">
III. Exemple <input type="text" name="auteur" value="Votre
nom"><br />
Voyons déjà un petit code : <textarea name="texte" rows="5"
cols="10">Saisissez votre
<?php commentaire</textarea><br />
$connect = mysql_connect('myserver', 'mylogin', <input type="submit" name="submit"
'mypassword'); value="Envoyer">
mysql_select_db('myDB'); </form>
if ($_SERVER['REQUEST_METHOD'] == 'POST') { </div>
$news_id = $_POST['news_id']; </body>
mysql_query("INSERT INTO commentaires SET </html>
news_id='$news_id',
auteur='".mysql_escap
e_string($_POST['auteur'])."', A la lecture du code, on comprend immédiatement
texte='".mysql_escape ce à quoi il est destiné, c'est l'avantage. On appelle
_string($_POST['texte'])."', ça un traitement procédural. L'inconvénient, c'est
date=NOW()" que les couches sont mélangées. Dans le
); traitement d'informations sur le web, généralement
header("location: ".$_SERVER['PHP_SELF']."? on distingue 3 couches : le modèle qui gère la
news_id=$news_id"); manière d'accéder aux données, la vue qui se
exit; charge de présenter des données, et le contrôle,
} else { c'est l'étape intermédiaire de sélection et fusion des
$news_id = $_GET['news_id']; données. On peut donc factoriser le code pour bien
} séparer ces 3 couches, voyez plutôt :
?>
<html> MYMODEL.PHP
<head>
<title>Les news</title> <?php
</head> function dbconnect()
<body> {
<h1>Les news</h1> // static $connect = null;
<div id="news"> //if ($connect === null)
<?php {
$news_req = mysql_query("SELECT * FROM $connect = mysql_connect('localhost', 'root',
news WHERE id='$news_id'"); 'root') or die (" Error connect");
$news = mysql_fetch_array($news_req); mysql_select_db('basenews') or die ( "Error
?> Select db");
<h2><?php echo $news['titre'] ?> postée le <?php
echo $news['date'] ?></h2> }
<p><?php echo $news['texte_nouvelle'] ?> </p> //return $connect;
<?php }
3
MYVIEW.PHP
function get_news($id)
{ <html>
dbconnect(); <head>
$news_req = mysql_query("SELECT * FROM news <title>Les news</title>
WHERE id='$id'"); </head>
return mysql_fetch_array($news_req); <body>
} <h1>Les news</h1>
function get_comments($news_id) <div id="news">
{ <h2><?php echo $news['titre'] ?> postée le <?php
dbconnect(); echo $news['titre'] ?></h2>
$comment_req = mysql_query("SELECT * FROM <p><?php echo $news['texte_nouvelle'] ?> </p>
commentaires WHERE news_id='$news_id'"); <h3><?php echo $nbre_comment ?>
$result = array(); commentaires relatifs à cette nouvelle</h3>
while ($comment = <?php foreach ($comments AS $comment) {?>
mysql_fetch_array($comment_req)) { <h3><?php echo $comment['auteur'] ?> a écrit
$result[] = $comment; le <?php echo $comment['date'] ?></h3>
} <p><?php echo $comment['texte'] ?></p>
return $result; <?php } ?>
} <form method="POST" action="<?php echo
$_SERVER['SCRIPT_NAME'] ?>"
name="ajoutcomment">
function nb_comments($news_id) <input type="hidden" name="news_id" value="<?
{ php echo $news['id']?>">
dbconnect(); <input type="text" name="auteur" value="Votre
$comment_req = mysql_query("SELECT count(*) nom"><br />
FROM commentaires WHERE news_id='$news_id'"); <textarea name="texte" rows="5"
$comment = mysql_fetch_array($comment_req); cols="10">Saisissez votre commentaire</textarea><br
return $comment[0]; />
<input type="submit" name="submit"
} value="Envoyer">
</form>
function insert_comment($comment) </div>
{ </body>
dbconnect(); </html>
$news_idm= $comment['news_id'];
mysql_query("INSERT INTO commentaires
SET news_id='$news_idm',
auteur='".mysql_real_escape_string($comment['aut
eur'])."', MYCONTROLLER.PHP
texte='".mysql_real_escape_string($comment['texte
'])."', <?php
date=NOW()"); require ('mymodel.php');
echo " INSERTION REUSSIE"; if ($_SERVER['REQUEST_METHOD'] == 'POST') {
} insert_comment($_POST);
?> // header("HTTP/1.1 301 Moved Permanently");
//header("location: {$_SERVER['SCRIPT_NAME']}?
news_id={$_POST['news_id']}");
//header("location: $_SERVER['SCRIPT_NAME']?
news_id=$_POST['news_id']");
exit;
} else {
$news = get_news($_GET['news_id']);
$comments = get_comments($_GET['news_id']);
$nbre_comment = nb_comments($_GET['news_id']);
require ('myview.php');}
?>

Vous aimerez peut-être aussi