Architecture : Le Design Pattern MVC en PHP

PHP cours tutorial

Le Design Pattern MVC

Le design pattern (patron de conception) est une manière de résoudre un problème de programmation; généralement par la programmation orienté objet, mais pas toujours.

Au fil du temps, certaines conceptions sont devenues récurrentes face à certaines situations et elles ont été documentées, nommées et standardisées.

Dans le domaine du web, le Design Pattern Modèle Vue Contrôleur (MVC) est l'un d'eux.

Le Design Pattern MVC est une façon de s’organiser lors de la conception d’un projet pour faciliter la tache aux différents intervenant lors de la conception, la mise à jour ou le débogage.

L'architecture MVC cherche à séparer trois choses :

  • la façon d'accéder aux données, soit le modèle
  • l'interface homme/machine:  l'habillage et le design, soit les vues
  • les traitements liés au métier/domaine de l'application, soit les contrôleurs

Les contrôleurs permettent de répondre aux actions de l'utilisateur. Chaque contrôle est associé à une vue : cette dernière permet de présenter l'information retournée à l'utilisateur.

Au fil du temps, le pattern MVC a évolué vers le MVC2. Dans l'architecture MVC 2, il n'existe plus qu'un seul et unique contrôleur réceptionnant toutes les requêtes clientes.

Passons à quelque chose de concret !

En première étape créez une base de données dans votre serveur local et nommez la « test ».

Puis exécutez la requête SQL suivante pour créer la table « personne ».

Sélectionner le code

  --
  -- Structure de la table `personne`
  --
   
  CREATE TABLE IF NOT EXISTS `personne` (
    `id` int(11) NOT NULL,
    `nom` varchar(30) NOT NULL,
    `prenom` varchar(30) NOT NULL,
    `age` int(11) NOT NULL
  ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
   
  --
  -- Contenu de la table `personne`
  --
   
  INSERT INTO `personne` (`id`, `nom`, `prenom`, `age`) VALUES
  (1, 'Olivier', 'Caen', 42),
  (2, 'Dubois', 'Paul', 32),
  (3, 'Le noir', 'George', 24),
  (4, 'Dubois', 'Cati', 42);

 

 La second partie l’exemple le plus simple est : une page affichant un listing de personne pourrait être la suivante.

Sélectionner le code

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//FR"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang=
  "en_US">
    <head>
      <title>
        Exemple
      </title>
    </head>
    <body>
    <?php
              $dbname= 'teste';
      $dbhost='localhost'; //votre serveur
              $dbuser='root'; // utilisateur
              $dbpass=''; // mot de passe
      $db=mysql_connect($dbhost,$dbuser,$dbpass);
      mysql_select_db($dbname,$db);
      $query="SELECT * FROM personne ";
     $req=mysql_query($query)or die('Erreur
  SQL!<br>'.$sql.'<br>'.mysql_error());
     while ($row = mysql_fetch_array($req)) {
     echo "Nom : ".$row['nom']." Prénom : ".$row['prenom']." age ".$row['age']."<br
  />";
  }
      mysql_close(); 
    ?> 
    </body>
  </html>

 

Oui c’est simple mais tout est mélangé (html, php, et sql).

Imaginez que vous avez non pas 26 lignes mais quelques centaines, et que vous voulez faire une modification (une mise à jour par exemple )

Et qu’en plus vous travaillez en groupe et que chaque membre du groupe doit faire une modification sur la partie le concernant.

Comment vous allez vous en sortir ?!

La solution est un découpage du code c'est-à-dire appliquer l’architecture MVC .

Alors découpons le code de l’exemple précèdent :

Le modèle

Je vais commencer par le model dans lequel nous avons deux fichiers

Le premier modéle implémente la fonction mysql_fetch_all() qui n'est pas une fonction native de php.

Il convient de l'implémenter dans un fichier à part . Ici dans le fichier : connect_bd.php:

Sélectionner le code

  <?php
  $db = mysql_connect('localhost', 'root', '');
  mysql_select_db('teste',$db);
   
   function mysql_fetch_all($query, $kind = 'assoc') {
      $result = array();
      $kind = $kind === 'assoc' ? $kind : 'row';
      eval('while(@$r = mysql_fetch_'.$kind.'($query)) array_push($result, $r);');
      return $result;
  }
  ?>

 

Le second modèle qui donne accès aux données et est isolé dans une classe dao dans le fichier : dao_example_dao.php

Sélectionner le code

  <?php
   require ("connect_bd.php");
   class ExampleDao
   {
    public  function get_personnes()
    {
    $sql = "SELECT personne.nom, personne.prenom, personne.age FROM personne ";
    $query = mysql_query($sql) or die('Erreur SQL !<br>'.mysql_error());
    $all =  mysql_fetch_all($query);
    return $all;
    }
   }
  ?>

 

Les deux fichier (connect_bd.php et : dao_example_dao.php) serons placés dans un dossier : « dao »

Le Contrôleur :

Le contrôleur  (qui dans cet exemple ne fait pas grand chose) est isolé dans un fichier : « class_example.php » :

Il est mis dans un dossier « action ».

Sélectionner le code

  <?php
   require ("dao/dao_example_dao.php");
   
    class Example
   {
    public function example()
    {
      $exampleDao= new ExampleDao();
      $data = $exampleDao->get_personnes();
      require("web/affichage.php"); 
    }
  }
  ?>

 

Entré unique :

index.php:    qui sera placé à la racine du site.

Sélectionner le code

  <?php
      require("action/class_example.php");
      new Example();
  ?>

 

Enfin, l'affichage:

La Vue :

L’interface utilisateur est mis dans le fichier ; «  affichage.php » qui sera mis dans le dossier « web »:

Sélectionner le code

  <html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
    <head>
      <title>
        Exemple
      </title>
    </head>
    <body>
      <?php
  foreach ($data AS $row )
  {
  ?>
     Nom :
  <?php echo $row["nom"]; ?>
   Prénom :
  <?php echo $row["prenom"]; ?>
   Age :
   <?php echo $row["age"]; ?> <br/>
  <?php
  }
  ?>
    </body>
  </html>

 

Note :

Pour tester cet exemple il faut créer trois dossier à la racine de votre site en local, qui sont

Le dossier web, le dossier action et le dossier dao.

Puis placer dans chaque dossier les fichiers appropriés comme indiquer en haut dans le tutorial.  

Dans cette architecture le code est  beaucoup plus facile à maintenir.

  • L'enchaînement des écrans est défini par le point d'entré unique , une modification se fera à cet endroit (et pas en  recherchant quelque dizaines de lignes  perdus dans plusieurs centaines de lignes  de code)
  • Si on change de  base de données par la suite d’un changement d’hébergeur (par exemple), il est facile de ne modifier que le dao correspondant sans toucher le reste.
  • Et si le design évolue, seul les fichiers de la vue sont concernés.

L’architecture proposée dans cet exemple est à titre indicatif c’est à vous de la suivre ou de trouver une organisation qui vous convient.

Par carabde 20 Aout 2014

  • Trafic Booster
    hebergement web

    SCREEBER - Logiciel de copywriting

    SCREEBER - Logiciel de copywriting Augmentez vos résultats en rejoignant les 1600 entrepreneurs qui utilisent Screeber®, le seul logiciel de Copywriting (en français) qui rédige avec vous des textes de vente qui convertissent


    HTML5, CSS3, JavaScript pour débutants Tome 1
    HTML5, CSS3, JavaScript
    pour débutants Tome 1

    Premier tome d'une série vidéo dédiée à l'apprentissage des langages HTML, CSS et JavaScript.

    Regarder aussi nos cours :

    Exemple SVG

    Exemple SVG

    fonction md5

    Calcule le md5 d'une chaîne

    les cookies

    Les cookies : Définition et utilisation des cookies en javascript.



    Rentabilisez efficacement votre site