4Code Logo
retour page 1/1

Orienté Objet ... une notion de MVC vu par Moi ... :p

Le Model View Controler, lorsque j'en ai entendu parlé, je me suis dit, mais quésako ! ...et puis je l'ai étudié de plus près ... et en fin de compte, ... c'est très pratique !! pour de grosse application, bien sur, mais le principe est relativement très intèressant ... et je conseil de le dècliner ...

J'ai peut-être pas tout compris de l'utilisation courante de cette méthode, il est vrai que j'ai lu ça en diagonale ;) mais je vais vous expliquer comment je l'ai mis en place et comment je le met en place au quotidien !!

Tout d'abord nous allons envisager un site simple :

  • une interface graphique contenant modifiable (choix du template par l'internaute) :
    • un bandeau haut (contenant un formulaire d'identification),
    • un menu,
    • une zone de "contenu",
    • un bandeau vertical (pub),
    • et un bandeau bas (second menu).
  • quatre modules agissant exclusivement sur la zone de "contenu" :
    • une page texte,
    • un Blog (publication d'articles),
    • un forum,
    • un espace admin.
  • un suivi de navigation sous session (enregistrement des membres et des pages vues).
  • un enregistrement des événements liés à la pub (mouseOver, mouseOut, click, et pub en cours).

Bref, un site classique très facilement mis en place avec un CMS stable, mais que nous préférons coder à la main, pour garder toutes liberté dans notre code ...

Donc le Principe du Model View Controler :

1. On sépare tout :

  • d'un coté View, l'interface avec l'internaute c'est tout bettement les données transmisent à l'internaute, que ce soit du xHTML, du XML, du Js, du CSS ,du jSon ...
  • à l'opposé, le Model, est un script stockant les donnés tels que PDO:: il est entre la base de donnée et le script du codeur, il est utilisé par toute l'application et garanti l'intégrité des données dont il a la charge
  • entre les deux les contrôleur, ceux-ci font la liaison entre l'interface et la classe en charge de générée les données. Personnellement, je place les controler dans un container et les appels en fonction de la page demandée (vous comprendrez après) ...

2. présentation de l'hébergement :

  • un .htaccess placé à la racine du site nous revoie toutes nos urls vers index.php?page=$1
  • notre script index.php déclare les variables globales, les session, et déclare le MVC :

class container {
 var $model;
 var $containt;
 var $url;
 var design = false; // cette variable nous permet de decider si le design doit etre ou non affiché

 function __contruct($url){
   $this->url = $url;
   $this->model = new model(MYSQL_BdAuth); // on déclare un model avec la bdd à employer en parametre.
   if ($this->recupDemande() && $this->validInternaute() && $this->viewer())
     echo $containt;
   else header("location:http://".$_SERVER['HTTP_HOST']);
 }
 function recupDemande(){
   $e = explode('.', $this->url); //Nous allons récupérer l'extension, si il y en a une pour séparer les images, et autres fichiers et récupérer la bonne demande.
   $ext = (count($e) > 1) ? $e[$count($e)-1] : html; // sans extension, on considèreras avoir reçu la demande pour une page.
   // Nous devons faire un tri, afin d'appeler la fonction adéquate.
   $fonc = array(
             html => page,
             php => page,
             png => image,
             jpg => image,
             gif => image,
             js => script,
             css => script
         );
   if (!$fonc[$ext])
     return false;
   return $this->$fonc[$ext]($ext);
 }
 function image(){
     $this->containt = /* récupérer l'image stockée dans le dossier IMG_PATH, déclarez le header() et retournez l'image relue, redimensionnée si besoin .... */
     return true ;
 }
 function script($ext){
     $this->containt = readfile({strtoupper($ext.'_PATH')}.$this->url);
     return (!$this->contain) ? false : true ;
/* ici on retourne le fichier domaine.com/js/mesJs/script.js lorsqu'il est demandé domaine.com/mesJs/script.js !
 cela permet aussi de perdre les internautes souhaitant vous pirater des images et/ou des script ... !! le dossier domaine.com/mesJs/ n'existe pas ... et n'a jamais existé ! */
 }
 function page($ext){
     $this-> design = true;
     $array = $this->model->select('*', 'pages', 'url = "'.$this->url.'"', 1);
     /* on commence à utiliser la class model, et l'on constate que celle-ci va contenir 
     une fonction select (pratique ;) ) qui prend en paramètres fields, table, la clause WHERE, et le nb de lignes retournées (LIMIT) 
     et qui nous retourne les résultats de la requête sous forme de tableaux $array[numRow] = array(row) */

/* la structure de notre tables est :
id   |    nom    |   title    |  private  |    url   |  controler  |   fonction  | param
01  |  acceuil  | acceil   |     0       |           |     text       |  affichTex | 01
02  |  Article  |  Blog    |     0       |  blog  |     blog      |  listBlog    |
03  |   admin  |  admin  |     1       | admin |     admin   |  _default   |
...
*/
     include_once CLASS_PATH.$array[0]['controler'].'.php';
     $controler = new $array[0]['controler'](); // on déclare notre controler
     $this->containt = $controler->$array[0]['fonction']($array[0]['param']);
     return true;
 }
 function validInternaute(){
     /* fonction en charge de vérifier si l'internaute à ne niveau de sécurité requis pour visualiser cet élément
     on peux ainsi vérifier que ce dernier à bien une variable de session $_SESSION['visiteur'] attribuée lors de la visualisation d'une page,
     dans le cas contraire, il ne pourrais visualiser un script, ni une image ...
     On en profite pour stocker dans une table de statistique quels éléments ont été demandés par l'internaute, ou on vérifie le couple identifiant / mot de passe récupéré en $_POST suite à lka validation du formulaire ... ...
     */
 }
 function viewer(){
    if(!this->design)return true;
    // si la variable $this->design est restée à false, c'est que nous n'avons pas affiché de page, mais plutôt une image ou un script ... donc pas de design dans le viewver ...
     /* en charge de monter le design, on la verra plus tard !! */
 }
}

Voila pour notre container en charge d'appeler le controler. Je ne vais pas m'atardé sur un controler complexe, ce n'est pas le but, et vais donc traité le controler text() qui n'a pour fonction que de récupérer un text situé dans le model et de le transmettre ...

à suivre ...

par Nours312 le 29/04/2009 à 00:58

Commentaires des internautes :
retour page 1/1