Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework L'objectif de ce document est de poser des bases de réflexion sur la modélisation d'un projet réalisé en langage PHP orienté objet. La finalité est de réaliser ce projet en créant un mini framework basé sur le modèle MVC (Modèle Vue Contrôleur). I - LE MODELE MVC (Modèle Vue Contrôleur) MVC (Modèle Vue Contrôleur) a pour objectif d'organiser la réalisation de l'application et à séparer complètement la présentation (Vue) des données (Modèle) et des traitements (Contrôleur). On définit le rôle des trois entités de la façon suivante : Modèle : c'est la logique métier de l'application ; Vue : définit l'interface utilisateur ; Contrôleur : prends en charge la gestion des évènements pour mettre à jour la vue ou le modèle. Le mini framework proposé dispose d'une couche supplémentaire (Dispatcher), permettant d'aiguiller les actions du contrôleur en fonction des choix de l'utilisateur. II - LE MODELE UML DE L'APPLICATION ETUDIEE On se propose d'étudier une application permettant de gérer un parc de machines. Les machines seront caractérisées par : un nom ; une adresse IP; une adresse MAC ; une localisation (salle). Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 1/17
II.1 Diagramme des cas d'utilisation II.2 Diagramme des classes II.3 Diagramme de séquences Cas d'utilisation «Initialiser» Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 2/17
Cas d'utilisation «Visualiser les machines» Cas d'utilisation «Rechercher des machines» Cas d'utilisation «Visualiser les machines sous forme graphique» Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 3/17
III - REALISATION DE L'APPLICATION III.1 Les fichiers L'arborescence du projet est la suivante : Conformément à la modélisation, nous allons créer 5 pages en relation avec un seul contrôleur et 4 actions : Dispatcher Page Contrôleur Action index.php views/parc/index.php controlers/parc.php parc::index listage.php views/parc/recherche.php controlers/parc.php parc::recherche recherche.php views/parc/recherche.php controlers/parc.php parc::recherche formip.php views/parc/formip.php controlers/parc.php parc::formip affichage views/parc/affiche.php controlers/parc.php parc::affiche Lorsque qu'on se connecte au site on appelle le dispatcher index.php qui sollicite l'action index du contrôleur controlers/parc.php. Ceci se traduit par l'affichage de la page views/parc/index.php. L'utilisateur a 3 choix : Listage : On appelle le dispatcher listage.php qui sollicite l'action recherche du contrôleur controlers/parc.php. Ceci se traduit par l'affichage de la page views/parc/recherche.php. Recherche : On appelle le dispatcher formip.php qui sollicite l'action formip du contrôleur controlers/parc.php. Ceci se traduit par l'affichage du formulaire views/parc/formip.php. Lors de la validation du formulaire, on appelle le dispatcher Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 4/17
recherche.php (en lui passant les paramètres saisis) qui sollicite l'action recherche du contrôleur controlers/parc.php. Ceci se traduit par l'affichage de la page views/parc/recherche.php. Affichage : On appelle le dispatcher affichage.php qui sollicite l'action affiche du contrôleur controlers/parc.php. Ceci se traduit d'abord par la création d'une image au format png à l'aide de la librairie jpgraph puis par l'affichage de la page views/parc/affiche.php qui se charge d'afficher cette image. Remarques : Les différentes pages sont constituées du squelette contenu dans la page views/layout/default.php. III.2 Sources 3.2.1 Dispatchers // commun.php // code commun a tous les dispatchers //WIN32 //define('root', 'C://wamp/www/parc/'); // LINUX define('root', '/var/www/www/parc/'); define('webroot', ''); // On inclut les fichiers de Core require(root.'core/model.php'); require(root.'core/controller.php'); //echo 'Connexion a la BDD'; mysql_connect('localhost','root','****'); mysql_select_db('parc'); // On inclut le controleur require('./controllers/parc.php'); // On initialise le controleur $controller = new parc(); // index.php // Dispatcher principal //On inclut le fichier commun Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 5/17
require('commun.php'); // On appelle l'action du controleur $controller->index(); //listage.php // Dispatcher secondaire // On inclut le fichier commun require('commun.php'); // On appelle l'action du controleur $controller->recherche(""); //recherche.php // Dispatcher secondaire // On inclut le fichier commun require('commun.php'); // On recupere les donnees du formulaire extract ($_POST); // On appelle l'action du controleur $controller->recherche($addip); //formip.php // Dispatcher secondaire // On inclut le fichier commun require('commun.php'); // On appelle l'action du controleur $controller->formip(); //affichage.php // Dispatcher secondaire Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 6/17
// On inclut le fichier commun require('commun.php'); // On appelle l'action du controleur $controller->affiche(); 3.2.2 Pages (vues) //views/layout/default.php <HTML> <HEAD> <TITLE> Parc </TITLE> </HEAD> <BODY> <h1>bts IRIS - Gestion du parc de machines</h1> echo $content_for_layout; <p> <a href=" echo WEBROOT; index.php"> echo 'acceuil'; </a> </p> <BODY> </HTML> //views/parc/index.php <h2> <a href=" echo WEBROOT; listage.php"> echo 'Listage'; </a> </h2> <h2> <a href=" echo WEBROOT; formip.php"> echo 'Recherche'; </a> </h2> <h2> <a href=" echo WEBROOT; affichage.php"> echo 'Affichage'; </a> </h2> //views/parc/recherche.php <h2> <a> echo "Affichage des Machines</br>"; </a> </h2> Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 7/17
echo "<table border=1 width=\"100%\">"; $liste_indices=array_keys((array)$record[0]); echo "<tr>"; while($indice=each($liste_indices)) { echo "<td align=center>"; echo $indice['value']; echo "</td>"; echo "</tr>"; foreach((array)$record as $cle_tableau=>$ligne) { echo "<tr>"; foreach($ligne as $cle=>$valeur) { echo "<td align=center>"; echo $valeur; echo "</td>"; echo "</tr>"; echo "</table>"; //views/parc/formip.php <body> <h2> Selection d'une machine dans le domaine</h2> <form name="formip" method="post" action=" echo WEBROOT; recherche.php"> <p>adresse IP :</p> <p><input name="addip" size="15" maxlength="15" type="text"></p> <p><input value="rechercher" type="submit"></p> </form> </body> //views/parc/affiche.php <img src="/images/monimage.png"/> Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 8/17
3.2.3 Le contrôleur //controllers/parc.php class parc extends Controller{ var $models = array('bddparc'); //Action index function index(){ $this->render('index'); function recherche($ip){ $d['record'] = $this->bddparc->query("select id, ip, mac, nom, salle FROM machines WHERE ip LIKE '$ip%' ORDER BY ip ASC"); //print_r($d); $this->set($d); $this->render('recherche'); function affiche(){ require_once ('./jpgraph/jpgraph.php'); require_once ('./jpgraph/jpgraph_line.php'); require_once ('./jpgraph/jpgraph_bar.php'); $nb = 15; // On affiche l'id des 15 derniers enregistrements $var=id; $d['record'] = $this->bddparc->getlast($nb); $this->set($d); for ($i=0; $i<$nb; $i++) { $donnees[$i] = $d['record'][$i][$var]; //print_r($donnees); $largeur = 500; $hauteur = 400; // Initialisation du graphique $graphe = new Graph($largeur, $hauteur); // Echelle lineaire ('lin') en ordonnee et pas de valeur en abscisse ('text') // Valeurs min et max seront determinees automatiquement Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 9/17
$graphe->setscale("textlin"); // Creation de l'histogramme $histo = new BarPlot($donnees); //$histo = new BarPlot($d['record']['id']); // Ajout de l'histogramme au graphique $graphe->add($histo); // Ajout du titre du graphique $graphe->title->set("histogramme"); // Affichage du graphique $graphe->stroke("/var/www/images/monimage.png"); // on enregistre l'image //imagepng($graphe, "/var/www/images/monimage.png"); $this->render('affiche'); function formip(){ $this->render('formip'); 3.2.4 Le modèle //models/bddparc.php class BddParc extends Model{ var $table = 'machines'; //nom de la table function getlast($num){ return $this->find(array( 'limit' => $num, 'order' => 'id DESC' )); Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 10/17
3.2.5 Le contrôleur et le modèle générique commun à chaque projet //core/controller.php class Controller{ var $vars = array(); var $layout = 'default'; function construct(){ if(isset($_post)){ $this->data = $_POST; if(isset($this->models)){ foreach($this->models as $v){ $this->loadmodel($v); function set($d){ $this->vars = array_merge($this->vars,$d); // inclusion du fichier passé en paramètre function render($filename){ extract($this->vars); ob_start(); require(root.'views/'.get_class($this).'/'.$filename.'.php'); $content_for_layout = ob_get_clean(); if($this->layout==false){ echo $content_for_layout; else{ require(root.'views/layout/'.$this->layout.'.php'); function loadmodel($name){ require_once(root.'models/'.strtolower($name).'.php'); $this->$name = new $name(); Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 11/17
//core/model.php /** * Objet Model * Permet les interactions avec la base de donnees * */ class Model{ public $table; public $id; /** * Lit une ligne dans la base de donnees par rapport a l'id de l'objet * @param $fields Liste des champs a recuperer * */ public function read($fields=null){ if($fields==null){ $fields = "*"; $sql = "SELECT $fields FROM ".$this->table." WHERE id=".$this->id ; $req = mysql_query($sql) or die(mysql_error()."<br/> => ".mysql_query()); $data = mysql_fetch_assoc($req); foreach($data as $k=>$v){ /** $this->$k = $v; * Permet de recuperer plusieurs lignes dans la BDD * @param $data conditions de recuperations * */ public function find($data=array()){ $conditions = "1=1"; $fields = "*"; $limit = ""; $order = "id DESC"; extract($data); if(isset($data["limit"])){ $limit = "LIMIT ".$data["limit"]; $sql = "SELECT $fields FROM ".$this->table." WHERE $conditions ORDER BY $order $limit"; $req = mysql_query($sql) or die(mysql_error()."<br/> => ".$sql); $d = array(); Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 12/17
while($data = mysql_fetch_assoc($req)){ $d[] = $data; return $d; /** * Permet de faire une requete complexe * @param $sql Requete a effectuer * */ public function query($sql){ $req = mysql_query($sql) or die(mysql_error()."<br/> => ".$sql); $d = array(); while($data = mysql_fetch_assoc($req)){ $d[] = $data; return $d; /** * Permet de charger un model * @param $name Nom du modele a charger * */ static function load($name){ require("$name.php"); return new $name(); Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 13/17
III.3 Mise en place de la BDD Il faut créer une base nommée parc contenant une table nommée machines. A l'aide de phpmyadmin on exécute la requête SQL suivante : -- -- Creation de la table `machines` dans la base `parc` -- CREATE DATABASE IF NOT EXISTS `parc`; CREATE TABLE IF NOT EXISTS `parc`.`machines` ( `id` int(11) NOT NULL auto_increment, `ip` char(15) NOT NULL, `mac` char(17) NOT NULL, `nom` char(15) NOT NULL, `salle` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=82 ; -- -- Contenu de la table `machines` -- INSERT INTO `parc`.`machines` (`id`, `ip`, `mac`, `nom`, `salle`) VALUES (47, '172.17.5.4', '00:1a:73:7d:e0:eb', 'tsirist-w-jcc', 2), (46, '172.17.5.3', '00:00:6c:c7:6b:51', 'tsirist-p-jcc', 2), (45, '172.17.5.2', '00:14:6c:65:86:ab', 'tsirist-w-remy', 2), (44, '172.17.5.1', '00:a0:d1:b0:47:38', 'tsirist-p-remy', 2), (16, '172.17.4.21', '00:0d:56:c2:f2:5a', 'tsirist-01', 2), Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 14/17
(17, '172.17.4.22', '00:0d:56:c2:f3:a7', 'tsirist-02', 1), (18, '172.17.4.23', '00:0d:56:c2:e8:4d', 'tsirist-03', 1), (19, '172.17.4.24', '00:0d:56:c2:f1:b3', 'tsirist-04', 1), (20, '172.17.4.25', '00:0d:56:c2:f4:26', 'tsirist-05', 1), (21, '172.17.4.26', '00:0d:56:c2:f2:fa', 'tsirist-06', 1), (22, '172.17.4.27', '00:0d:56:c2:f3:ad', 'tsirist-07', 1), (23, '172.17.4.28', '00:11:85:10:f4:bf', 'tsirist-08', 2), (24, '172.17.4.29', '00:11:85:11:01:2b', 'tsirist-09', 1), (25, '172.17.4.30', '00:11:85:14:4e:37', 'tsirist-10', 1), (26, '172.17.4.31', '00:11:85:14:4d:99', 'tsirist-11', 1), (27, '172.17.4.32', '00:11:85:62:71:05', 'tsirist-12', 1), (28, '172.17.4.33', '00:11:85:14:4e:22', 'tsirist-13', 1), (29, '172.17.4.34', '00:11:85:14:4d:ab', 'tsirist-14', 1), (30, '172.17.4.35', '00:0f:b5:85:0c:21', 'tsirist-15', 0), (31, '172.17.4.36', '00:14:85:7d:d2:35', 'tsirist-16', 0), (32, '172.17.4.37', '00:14:85:7a:a9:8c', 'tsirist-17', 0), (79, '172.17.4.38', '00:14:85:7D:CF:AA', 'tsirist-18', 0), (34, '172.17.4.39', '00:14:85:79:78:fa', 'tsirist-19', 0), (77, '172.17.4.40', '00:14:85:7a:78:a3', 'tsirist-20', 0), (80, '172.17.4.41', '00:14:85:79:78:F8', 'tsirist-21', 0), (38, '172.17.4.42', '00:14:85:7a:78:81', 'tsirist-22', 0), (39, '172.17.4.43', '00:14:85:7a:78:dc', 'tsirist-23', 0), (40, '172.17.4.44', '00:14:85:7a:78:a5', 'tsirist-24', 0), (41, '172.17.4.45', '00:14:85:7a:78:de', 'tsirist-25', 0), III.4 Résultats 3.4.1 La page principale Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 15/17
3.4.2 Listage 3.4.3 Recherche Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 16/17
3.4.4 Affichage Remarques : Pour utiliser la librairie graphique gd (donc jpgraph) sous Linux, il est nécessaire de recompiler php ou d'utiliser les dépôts Dotdeb pour avoir la dernière version de php. Le dossier dans lequel est stocké l'image, doit être accessible en lecture et écriture à l'utilisateur www-data. Modélisation PHP Orientée Objet pour les Projets Modèle MVC Mini Framework 17/17