Modèle-Vue-Contrôleur (MVC) en PHP

Exemple simple

On peut séparer la vue des données simplement en faisant appel à require.

<?php

$title = "Super titre";
$paragraph = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";

/* On importe pageVue.php
Les variables seront accessibles */
require 'pageVue.php';

?>

Ensuite, on peut créer un fichier PHP pour la vue, pageVue.php par exemple.

On peut utiliser <?= ?> pour afficher la variable.

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <!-- affiche le titre : echo $title -->
  <title><?= $title ?></title>
</head>
<body>
  <!-- affiche le titre : echo $title -->
  <h1><?= $title ?></h1>
  <!-- affiche le paragraphe : echo $paragraph -->
  <p><?= $paragraph ?></p>
</body>
</html>

Exemple : MVC et le routage

Nous voulons que la page affiche Hello ou Bonjour pour un nom donné.

L'URL devra avoir ce format : hello/fr/nom

.htaccess

Il faut d'abord redéfinir les règles dans le fichier .htaccess

RewriteEngine On

# ignore les fichiers, dossier existant
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# chaque requete get sera exécutée avec l'action action=var
RewriteRule ^(.*)$ index.php?action=$1 [L,QSA]

Si j'écris l'URL 127.0.0.1/home/fr/ronan ce sera convertit en 127.0.0.1/index.php?action=home/fr/ronan

Le dispatcheur : index.php

Le fichier index.php va trouver le bon contrôleur. Dans notre exemple, il va chercher le contrôleur HelloController.

<?php

$action = $_GET['action'];

/* Decoupe l'url en liste */
$action_list = explode('/', $action);

if(isset($action) && isset($action_list[0])) {
  /* On trouve le nom du controleur */
  $controller_name = $action_list[0] . 'Controller';

  /* On importe le controleur */
  require $controller_name . '.php';

  /* On instancie le controleur */
  $controller = new $controller_name;
}

?>

Le modèle : HelloModel

Le constructeur du modèle prend en argument la langue (format ISO) et le nom de la personne.

Ensuite, le modèle va chercher la traduction et concatène celle-ci avec le nom.

<?php

class HelloModel {

  function __construct($lang, $name){

    $hello_lang_map = array('fr' => 'Bonjour', "en" => 'Hello');

    $this->msg = $hello_lang_map[$lang] .', ' . $name;
  }

}

?>

La vue

La vue fait simplement un echo de la variable msg du contrôleur.

<h1>
  <?= $this->msg ?>
</h1>

HelloController

Le contrôleur appelle le modèle et affiche la vue.

>?php

require 'HelloModel.php';

class HelloController {

  function __construct(){

    $action = $_GET['action'];

    /* Decoupe l'url en list */
    $action_list = explode('/', $action);

    /* Injecte langage et nom */
    $model = new HelloModel($action_list[1], $action_list[2]);
    
    $this->msg = $model->msg;
    require 'hello.php';

  }

}

?>

Conclusion

C'est un exemple simple pour comprendre le MVC surtout si vous n'êtes pas familier avec la programmation orientée objet avec PHP

Les exemples plus haut ne montrent pas la connexion avec une base de données avec DAO (Data Access Object). Normalement le modèle appel la base de données et exécute un traitement. Dans mon exemple, le traitement est trivial et volontairement simplifié.

Vous pouvez aussi utiliser le routage avec l'annotation @Route du framework Symfony pour remplacer ce code.

Commentaires