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
Enregistrer un commentaire