COMPRENDRE LE PATTERN MVC AVEC UN EXEMPLE SIMPLE 15 mars 2012 · par Mathieu · d

COMPRENDRE LE PATTERN MVC AVEC UN EXEMPLE SIMPLE 15 mars 2012 · par Mathieu · dans Développement web 0 inShare 0 Le pattern MVC est le concept à la mode en matière de programmation avec interface graphique, et notamment en développement web. Symfony, Zend et tous les grands frameworks dont la renommée n’est plus à faire l’utilisent. Et ce n’est pas pour rien. Peut-être l’avez-vous toujours utilisé ? Peut-être voulez-vous vous y mettre timidement ou peut-être vous demandez-vous encore si c’est bien la peine puisque vos applications en PHP classique fonctionnent très bien. Avant toute chose, je tiens à noter que mes propos sont largement inspirés par la documentation et les exemples de Symfony, produite par la fabuleuse équipe de Fabien Potencier. Ce billet servira sans doute d’introduction à un petit tutoriel m’accompagnant dans la (re)découverte de Symfony2. Ce qu’est le MVC et ce qu’il n’est pas Tout d’abord, MVC est l’acronyme de « Model View Controller ». En français « Modèle Vue Controlleur »: on a du bol, cela commence par les mêmes lettres. Le MVC n’est pas une technologie sortie des laboratoires de la NASA et n’a pas besoin d’une configuration serveur différente de celle que vous posséder actuellement. Il n’existe donc pas de module php-mvc à installer via apt-get Le MVC ne va pas non plus rendre vos applications plus rapides, efficaces ou « hype ». Le MVC ne rendra pas votre site plus attrayant ou davantage promis à la gloire. Par contre, il rendra votre application facilement maintenable, accélérera considérablement vos développement futurs et, lorsque vous regarderez votre code, vous rendra fier d’en être l’auteur (ou alors, c’est que vous êtes vraiment mauvais). Ok, soit. Mais en quoi cela consiste véritablement ? Je ne vais pas commencer par vous expliquer chaque terme de « Modèle Vue Contrôleur », mais plutôt partir d’un petit exemple en PHP classique. Si, comme moi, vous pratiquez ce langage depuis plusieurs années, vous avez probablement réalisé des pages, extrêmement rapides à écrire, qui comportaient à la fois des instructions de connexion à une base de données, des récupérations de données à partir de cette base, et l’affichage de celles-ci dans un petit canevas HTML. C’est facile et cela pourrait donner quelque chose comme cela, dans le cadre d’une page affichant des articles de blog: ? 1 2 <?php $con = mysql_connect('localhost', 'kershin', 'blabla45'); 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 mysql_select_db('my_db', $con); $query = "SELECT id, title, date_create FROM entry"; $res = mysql_query($query); ?> <html> <head> <title>Entrées de blog récentes</title> </head> <body> <h1>Les posts récents:</h1> <ul> <?php while($r = mysql_fetch_object($result)) { ?> <li> <a href="/read.php?id=<?php echo $r->id; ?>"> <?php echo $r->title; ?> </a> </li> <?php } ?> </ul> </body> </html> <?php mysql_close($con); ?> Votre application fonctionne dès lors très bien, mais: 1. Il n’y a aucun contrôle d’erreur (quid si la DB est HS ?) 2. L’organisation laisse à désirer. 3. Il est quasiment impossible de réutiliser le code ailleurs. Comment pourrait-on améliorer cela ? La philosophie du MVC a suivi le cheminement suivant: 1. Isoler la partie visuelle La première chose qui vient à l’esprit pour organiser un tant soit peu votre application est de séparer le code PHP du code HTML. Les soupes, c’est super pour la santé et c’est plein de vitamines, mais en programmation, mieux vaut ne pas en abuser. De plus, cela permettra de favoriser la réutilisation du code PHP et du template html. Pour cela, il faut arrêter de décortiquer le resultset de la base de données au sein même du template. Tout simplement parce que votre liste d’articles ne viendra pas toujours forcément de la DB, mais pourra venir d’un flux RSS, d’un fichier ou de n’importe quelle source que nous pourrions imaginer. Bien sûr, nous aurons toujours un peu de PHP dans notre template pour tout ce qui est affichage de variables, boucles et éventuellement structures alternatives, mais nous devons limiter celui-ci au strict minimum et, surtout, faire en sorte qu’il soit le plus générique possible. C’est ce que nous faisons ici, en modifiant quelque peu notre code et en déplaçant la partie HTML dans un autre fichier que nous appellerons list.php (celui-ci sera placé dans un dossier « templates »). Examinons les 2 fichiers: Le fichier index.php contenant votre code PHP: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // index.php <?php $con = mysql_connect('localhost', 'kershin', 'blabla45'); mysql_select_db('my_db', $con); $query = "SELECT id, title, date_create FROM entry"; $res = mysql_query($query); $posts = array(); while($r = mysql_fetch_object($res)) $posts[] = $r; mysql_close($con); ?> Le fichier list.php contenant le html: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <html> <head> <title>Entrées de blog récentes</title> </head> <body> <h1>Les posts récents:</h1> <ul> <?php foreach($posts as $post): ?> <li> <a href="/read.php?id=<?php echo $post->id; ?>"> <?php echo $post->title; ?> </a> </li> <?php endforeach ?> </ul> </body> </html> Bravo, vous venez de créer un contrôleur, personnifié par le fichier « index.php » ! Certes, pas encore très efficace, mais au moins il ne contient plus que du code PHP. Tout le côté programmation est maintenant isolé dans celui-ci. Il y a du mieux. Pour résumer: le contrôleur est le fichier qui réceptionne les demandes du client (l’internaute), traite les données et lui retourne une réponse valable. Votre contrôleur n’est, comme je l’ai dit plus haut, pas encore très efficace. Car si vous souhaitez maintenant créer une autre page, vous ne pouvez pas réutiliser « index.php » car il contient toute une série de traitements dont vous n’aurez pas besoin dans cette autre page. Et nous n’avons pas envie de nous amuser avec des switch n’est-ce-pas ? 2. Isoler les méthodes d’accès aux données. Admettons que notre deuxième page soit une page d’affichage d’un billet de blog en particulier, identifié par son id. Il faut que celle-ci puisse accéder aux méthodes de connexion à la base et de fermeture de connexion. Sans bien évidemment devoir copier-coller complètement toute une partie du code de la page « index.php ». Ce serait idiot ! Vous imaginez si, par la suite, vous devez rajouter une instruction dans le processus de connexion à la DB ? Il faudra vous repalucher l’ensemble de vos pages et, inlassablement, appuyer sur CTRL-V au même endroit. Epargnons-nous cela et sortons tout ce qui a trait à la DB de notre contrôleur. Pour cela, nous créerons un nouveau fichier appelé « model.php » qui ressemblera plus ou moins à ceci: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 // model.php function db_open_connexion() { $con = mysql_connect('localhost', 'kershin', 'blabla45'); mysql_select_db('my_db', $con); return $con; } function db_close_connexion($con) { mysql_close($con); } function get_posts() { $con = db_open_connexion(); $query = "SELECT id, title, date_create FROM entry"; $res = mysql_query($query, $con); $posts = array(); while($r = mysql_fetch_object($res)) $posts[] = $r; db_close_connexion($con); return $posts; } Suite à cela, notre fichier index.php (le contrôleur) devient: ? 1 2 3 4 5 // index.php require_once 'model.php'; $posts = get_posts(); require 'templates/list.php'; Il faut avouer que c’est déjà vachement mieux ! Ok: index.php ne servira toujours que pour afficher la liste des billets de blog, mais au moins il ne contient plus de code qui pourrait être nécessité par une autre page. Et cela, c’est vraiment bien ! La seule chose dans notre application qui ne peut pas être réutilisée, c’est la mise en page. Par exemple, tout ce qui ne concerne pas directement l’affichage de la liste des billets est sans doute commune à tout votre site. La balise html, head, body, etc, toutes ces choses qui, pour l’instant, doivent également être copiées-collées d’une page à l’autre. Donc, notre prochaine mission consistera à: 3. Isoler la mise en page. Pour cela, nous allons séparer notre code html en 2 fichiers distincts: un fichier de mise en page générale (layout.php) et un fichier bien spécifiquement lié à l’affichage de notre liste de billets de blog. Tout d’abord, voyons le fichier « layout.php »: ? 1 2 3 4 5 6 7 8 <html> <head> <title><?php echo $title ?></title> </head> <body> <?php echo $content ?> </body> </html> Et ensuite, le fichier « templates/list.php » que nous simplifierons ainsi: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php $title = "Liste de billets de blog" ?> <?php ob_start() ?> <h1>Les posts récents:</h1> <ul> <?php foreach($posts as $post): ?> <li> <a href="/read.php?id=<?php echo $post->id; ?>"> <?php echo $post->title; ?> </a> </li> <?php endforeach ?> </ul> <?php $content = $ob_get_clean() ?> <?php include 'layout.php' ?> 4. Aller plus loin. Maintenant, notre code html peut être réutilisé facilement. Pour prouver cela, nous allons créer la page dont nous parlions plus haut: la page « read.php » qui permettra de visionner le contenu d’un article de blog en particulier, identifié par son uploads/S4/comprendre-le-pattern-mvc-avec-un-exemple-simple.pdf

  • 23
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Oct 23, 2021
  • Catégorie Law / Droit
  • Langue French
  • Taille du fichier 0.3440MB