modélisation php orientée objet pour les projets modèle ... · bts iris jean-claude cabianca...

17
BTS IRIS Jean-Claude CABIANCA 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

Upload: vantruc

Post on 27-Jul-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

BTS IRIS Jean-Claude CABIANCA

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

BTS IRIS Jean-Claude CABIANCA

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

BTS IRIS Jean-Claude CABIANCA

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

BTS IRIS Jean-Claude CABIANCA

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

BTS IRIS Jean-Claude CABIANCA

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

<?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

<?php

// Dispatcher principal

//On inclut le fichier commun

Modélisation PHP Orientée Objet pour les Projets – Modèle MVC – Mini Framework 5/17

BTS IRIS Jean-Claude CABIANCA

require('commun.php');

// On appelle l'action du controleur

$controller->index();

?>

//listage.php

<?php

// Dispatcher secondaire

// On inclut le fichier commun

require('commun.php');

// On appelle l'action du controleur

$controller->recherche("");

?>

//recherche.php

<?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

<?php

// Dispatcher secondaire

// On inclut le fichier commun

require('commun.php');

// On appelle l'action du controleur

$controller->formip();

?>

//affichage.php

<?php

// Dispatcher secondaire

Modélisation PHP Orientée Objet pour les Projets – Modèle MVC – Mini Framework 6/17

BTS IRIS Jean-Claude CABIANCA

// 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>

<?php echo $content_for_layout;?>

<p>

<a href="<?php echo WEBROOT; ?>index.php"><?php echo 'acceuil'; ?></a>

</p>

<BODY>

</HTML>

//views/parc/index.php

<h2>

<a href="<?php echo WEBROOT; ?>listage.php"><?php echo 'Listage'; ?></a>

</h2>

<h2>

<a href="<?php echo WEBROOT; ?>formip.php"><?php echo 'Recherche'; ?></a>

</h2>

<h2>

<a href="<?php echo WEBROOT; ?>affichage.php"><?php echo 'Affichage'; ?></a>

</h2>

//views/parc/recherche.php

<h2>

<a><?php echo "Affichage des Machines</br>"; ?></a>

</h2>

Modélisation PHP Orientée Objet pour les Projets – Modèle MVC – Mini Framework 7/17

BTS IRIS Jean-Claude CABIANCA

<?php

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="<?php 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

BTS IRIS Jean-Claude CABIANCA

3.2.3 –Le contrôleur

//controllers/parc.php

<?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

BTS IRIS Jean-Claude CABIANCA

$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

<?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

BTS IRIS Jean-Claude CABIANCA

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

BTS IRIS Jean-Claude CABIANCA

//core/model.php

<?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

BTS IRIS Jean-Claude CABIANCA

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

BTS IRIS Jean-Claude CABIANCA

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

BTS IRIS Jean-Claude CABIANCA

(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

BTS IRIS Jean-Claude CABIANCA

3.4.2 –Listage

3.4.3 –Recherche

Modélisation PHP Orientée Objet pour les Projets – Modèle MVC – Mini Framework 16/17

BTS IRIS Jean-Claude CABIANCA

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