oujood.com

Architecture : Le Design Pattern MVC en PHP

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.

chercher |

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 ».

Exemple :       Copier 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.

Exemple :       Copier 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:

Exemple :       Copier 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

Exemple :       Copier 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 ».

Exemple :       Copier 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.

Exemple :       Copier 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 »:

Exemple :       Copier 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



Voir aussi nos tutoriel :

line-height

Définit la ligne de hauteur

border-bottom-width

Définit la largeur de la bordure inférieure

Objet string javascript

Objet string javascript : L'objet String (ou chaîne de caractères) est employé pour manoeuvrer un texte ou une partie d’un texte.