begin process at 2012 02 15 17:27:49
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Class et Objet ( POO )

 > L'APPROCHE MVC : MODÉLE VUE CONTROLEURS

L'APPROCHE MVC : MODÉLE VUE CONTROLEURS


 Information sur le tutoriel

 Description

Plus qu'une méthodologie, l'approche MVC c'est un ensemble de méthodologies et techniques visant à architecturer de manière rationnelle vos applications à travers votre SI.

Tutorial

Intro

Suite à quelques entretiens en SI, question récurrente et « limite » réductrice : Quels sont les 5 fondements de la programmation objet. Le polymorphisme, héritage, encapsulation .etc. et blabla.

En réalité, au delà de la programmation objet la méthodologie utilisée et l'architecture à mettre en place est tout aussi importante - on peut faire du spaghetti même avec .NET ou JAVA full orienté objet . et oui !

Pour ceux qui ne connaissent pas déjà je vous propose de voir l'approche MVC.

Définition

Déjà on ne parle pas de méthodologie ou technique ou bien techno MVC mais d'approche car le modèle MVC peut être constitué d'un ensemble de méthodologies, technos ou techniques.

Le mot MVC vient de MODEL - VIEW - CONTROLER ou en français Modèle - Vue - Contrôleur.

1 - Le Modèle :

C'est la représentation de chaque entité du SI. Quelques exemples : classe utilisateur, panier, facture.

2 - La vue :

C'est la représentation de l'IHM (interfaces visuelles). Fini le code spaghetti, ici on fait juste de l'affichage, aucun traitement ou définition. Exemple : afficher la liste des utilisateurs.

3 - Le contrôleur :

C'est la partie permettant de joindre le modèle et la vue. Effectue l'ensemble des actions demandées par la vue sur le modèle. Exemple : ajouter ou supprimer un utilisateur.

PRINCIPE

Le principe en développement (dans toutes les approches) c'est diviser pour mieux régner. Un exemple de la vie pratique :

Vous êtes fan de photos, vous en faites des tonnes à chaque occasion ! Les mettez-vous dans le même répertoire ? Ou encore mieux, parmi votre dossier vacances 2007 pour rechercher une foto avec votre chien la retrouverez-vous plus facilement en créant des catégories ou des sous-répertoires ou en stockant le tout dans un même dossier ?

La logique de la programmation objet est totalement similaire avec l'avantage en plus de retrouver votre code mais aussi de le rendre réutilisable.

Mais tout cela vous le savez déjà, et ce n'est pas l'approche MVC qui amène cette théorie d'atomisation. Mais entre la théorie et la pratique, lorsqu'on fait du développement IHM on perd vite les bonnes habitudes.

Voilà pourquoi l'approche MVC synthétise le tout sous 3 niveaux simplistes :

Faites des classes pour représenter votre système d'informations, faites des classes effectuant les manipulations de données (LECTURE / ECRITURE), utiliser une méthode permettant seulement d'afficher vos interfaces.

LE MODELE

Votre programme gère des machins ? Dans ce cas définissez chacun de ces machins sous la forme de classes, avec toutes les actions possibles qu'on peut faire dessus.

En plus de gagner un précieux temps lors des mises à jour de votre système, vos machins pourront facilement être étendus et réutilisés.

Du coup, on va aborder la partie mapping, car le plus souvent vos machins vous les stockez dans une base de données.

De manière simplifiée, le mapping consiste à encapsuler la structure de votre base de données et des actions possibles sur chaque entité. Quelques exemples : pdoMap ou  jDAO.

Une autre chose, si vous n'utilisez pas d'outil de mapping, utilisez au moins la couche ADO afin d'optimiser l'interopérabilité de votre code ainsi que son éventuelle migration de SGBD.

LE CONTROLEUR

Dans le contrôleur on ne doit pas y voir d'affichage ou de parties reliées à la structure directe des données. Un exemple sous PHP :

Evitez les trucs du genre : echo '<code html>..</machin chose>' ; ou bien $data = mysql_query('SELECT * FROM MA_TABLE..') ; ou comme on peut le voir souvent :

if ($_GET['delete']) mysql_query('DELET FROM MA_TABLE WHERE INDICE = '.$_GET['delete']);

Après avoir vu ce qu'il ne faut pas faire, je vous propose de voir ce qu'il faudrait faire. Dans votre SI votre interface doit pouvoir interagir avec votre SI, en MVC cela donne, les vues doivent interagir avec le modèle, et c'est la le rôle du contrôleur.

Du coup, dans le contrôleur vous pouvez instancier des objets, utiliser des fonctions à travers des structures conditionnelles.

Mais attention, il y a un HIC. Tout SI repose sur des règles métier car on ne développe pas pour des pommes mais bien pour des clients ayant des besoins très très spécifiques. Du coup le mieux serait de créer une classe métier spécialisée dans le traitement de votre modèle.

Si vous avez une dizaine de if imbriqués, et qu'une simple action dans le contrôleur fait interagir trop d'éléments variables, demandez-vous si ce ne serait pas mieux de créer une classe permettant de gérer ces différents cas de figures.

Pour résumer, le contrôleur doit contenir des instructions simples, idéalement des instanciations d'objets, avec des appels de méthodes. Un enfant de 10 ans devrais être capable de lire votre code sans avoir de notions d'algorithmie - Exemple :

$pomme = new pomme() ;
$pomme->laver() ;
$pomme->croquer() ;
$pomme->jeter() ;

Ca c'est pour la partie traitements, mais comme vous savez il y a globalement une très grosse partie lecture de données.

Dans cette partie le contrôleur ne va qu'instancier les données et surement pas effectuer l'affichage. C'est la vue qui s'en chargera.

LA VUE

La vue est souvent représentée par un système de templating.

1 - Les templates

Juste un petit sondage, qui pense que Smarty est excellent pour faire du MVC ?

Si oui, merci de répondre à cette question :

A quoi ça sert de séparer l'affichage et le code si on utilise un pseudo langage conditionnel ? Le but est de permettre à un designer d'intervenir sur l'affichage HTML, et non de le former à la syntaxe Smarty. Sinon il sera plus gagnant à apprendre le PHP directement.

Je n'ai pas trouvé pour le moment de système de templating plus performant ou plus complet que le PHP lui-même. J'ai néanmoins une préférence pour des solutions XML -

http://meta20.net/phpQuery
http://sourceforge.net/projects/dotview/ (solution que je suis entrain de développer)
http://www.pradosoft.com/

Pour cette partie, c'est à vous de trouver ce qui vous convient. Je ne peux que dépeindre ce qui peut être logique et efficace pour moi.

Donc, à par tout ça - normes contraignantes et syntaxe complexe - partons du fait que le designer fait un effort et veut apprendre quelques bases du PHP (echo + boucles foreach) - voyons le MVC avec de simples includes.

2 - Le principe

Votre contrôleur effectue le chargement de données, et doit les transmettre à la vue.  On peut tout simplement utiliser $GLOBALS[...] = new machin() ;

Le développeur fera son boulot en disposant les infos de machin dans un tableau par exemple. A lui d'utiliser < ?php echo $GLOBALS[...]->getNom() ; ?> par exemple.

Mais il manque une partie vous me direz, le chargement de la page, ou le système d'encapsulation permettant d'englober le design.

3 - Le router

Dans votre système, vous effectuez un chargement de la couche système (framework) puis vous devez indiquer quel contrôler et vue charger.

C'est le rôle du router, un objet prenant en compte les variables systèmes et effectuant le chargement du contrôler ainsi que son interfaçage avec la vue.

Dans notre exemple, imaginons que vous avez une variable $_GET['page'] et que vous êtes au courant des failles de sécurités dues aux inclusions dynamiques. 

Votre router chargera alors le contrôleur correspondant au chemin indiqué par $_GET['page'], puis effectuera l'affichage de la vue associée.

C'est assez synthétique en ce qui concerne l'exécution, par contre nous n'avons toujours pas vu l'encapsulation de l'interface.

4 - L'interface

Vous aimez les include('header.phtml') et include('footer.phml') ? Ben moi non, ceci pour la simple raison que lorsqu'une balise dans le header est oubliée, ou dans le footer, amusez-vous à debugger le HTML pendant des heures. Une autre raison, sous DreamWeaver ou autre logiciel, passez en mode design, vous n'aurez aucun aperçu.

Utilisons plutôt le router afin de lui définir quelques fonctions de chargement, puis créons quelques notions manquantes en PHP.

4.1 - Le master

Le design global de votre site, son architecture sera nommée le master ou plus communément le template.

A l'intérieur pas d'affichage et communication avec le contrôleur, seulement avec le router. On pourra y définir des zones dynamiques, ou bien l'emplacement prévu pour la page.

4.2 - Les WebControls

Parties indépendantes disposants d'une partie effectuant le chargement des données et d'une autre effectuant l'affichage. C'est les emplacements dynamiques des templates.

4.3 - La page

La page effectue l'affichage des données, et sera pré-bufférisée par le router puis restituée à l'emplacement prévu lors de l'exécution du master.

Donc conclusion, à vous de faire votre architecture de template - mais attention à ne pas réinventer la roue. Si la charge de travail est estimée à plus d'1j/h prenez un système de templating car vos besoins sont trop complexes.

5 - Quelques préconisations

Vous l'avez peut-être déjà remarqué, c'est finit le temps où on faisait 10 tableaux imbriqués et on mettait des spacer.gif à tout va.

Aujourd'hui tout va vers la normalisation, et en matière IHM ce qui est préconisé, c'est l'affichage XHTML représentant les données des pages et le CSS pour ce qui est de la disposition et habillage de la page.

Allez courage, une couche de plus.

 Historique

27 mai 2008 01:23:54 :
Coller Word fait 2 sauts de paragraphes par paragraphe ...

Commentaires

Commentaire de malalam le 01/06/2008 09:37:54 administrateur CS

Hello,

une bonne approche, simple, concise, parfaite pour un débutant voulant découvrir le MVC et qui peut lui donner envie d'approfondir.
Bien :-)

Commentaire de coucou747 le 04/06/2008 04:04:18 administrateur CS

idem

Commentaire de Mck666 le 23/06/2008 01:44:02

Bon article, personnellement pour séparer au mieux la couche vue, mes objets métiers et contrôleurs génèrent du XML que je parse avec des gabarits XSL. Cela me permet de bosser avec des web designers qui ne connaissent rien au PHP et de me concentrer uniquement sur l'architecture. J'ai testé pas mal de moteurs de template et même le Zend Framework, j'en suis revenu...

Commentaire de vincseize le 03/07/2008 02:36:49

mici, rien de plus

Commentaire de Luffy26 le 07/07/2008 18:05:25

En ce qui me concerne, je ne me considérais pas comme un complet débutant, pourtant je n'arrive pas à comprendre toutes les références de ce tuto. C'est quoi Smarty ? pdoMap ? ADO ? jDAO ?

Mais j'ai au moins compris la logique MVC, mais de là à la mettre en pratique :/ je pense que j'aurais du mal simplement avec ce cours...

Commentaire de aKheNathOn le 08/07/2008 09:19:00

Je t'invite à faire un tour sur google pour consulter le site des ces projets qui sont des outils interessants pour mieux t'aider à mettre en pratique la méthodo.

Le cours n'est pas là pour imposer un cheminement figé, du coup t'es moins encadré, le but étant de te faire chercher les solutions toi même et éviter une solution all in one qui souvent peut s'avérer de vraie boite noire.

Bonne prog et à +

Commentaire de jadu le 30/11/2008 10:27:02

un guide pour éviter de se perdre dans les méandres de ceux qui "savent mieux que les autres" ce qu'il FAUT faire !
Ici la liberté existe et donne envie d'aller chercher soi-même ! SUPER !

Commentaire de goosy le 17/02/2009 01:55:22

Salut à tous je recherche un framework php pas trop lourd digérer . Je suis encore entrain de lire la doc zend (un peu trop compliqué) et symphony (qui à l'air plus simple).Si quelqun connait un framework efficace et pas trop casse tête je suis client .

Commentaire de nuns le 27/04/2009 12:12:04

bonjour,
je trouve sympa le tuto, mais c'est dommage qu'il ne possède pas un petit exemple.

Salutation

Commentaire de gracevit le 30/07/2009 13:05:58

Salut,
excuse moi je suis débutant sur zend framework.
j'ai une ancienne base de données qui fonctionne avec le serveur unix.
en effet j'ai crée une autre base de donnée sur cet serveur et je voulais me connecté avec afin de tester mes scripts de la nouvelle base de données.
Malgrès, j'ai modifier la page de connexion de l'ancienne base données et d'autres pages de connexion(par exemple application/config/app.ini et dans controller/error et test ).mais je lance la page
il m'affiche le serveur introuvable alors j'ai crée la base et j'ai l'acces à cette base en ligne de commande.
Je ne sais pas si vous pouviez m'aidiez en me donnant un peu d'explication sur cette page.
Vraiment aidez moi
Cordialment

Commentaire de kr9zalid le 02/08/2009 13:37:14

très bon article pour commencer l'approche des mvc, très théorique, mais c'est mieux pour ne pas limiter l'utilisation a des cas limiter.

Commentaire de vivianperez le 12/10/2009 14:53:26

Bonjour,
J'ai déja fait qq applications en Java utilisant l'approche MVC et je vais être confronté à utiliser ce principe en web 2.0. Je suis tombé sur ce tuto qui est assez clair et bien expliqué mais il me manque un point important. Le contrôleur instancie le modèle, charge les données mais aussi gère les évènements, du moins c'est ce que j'ai appris. En java, il est simple d'avoir le code correspondant aux évènements de l'IHM dans le contrôleur puisque l'IHM est construite sous forme de classes qui sont instanciées dans le contrôleur. Mais en php ou javascript, comment séparer la gestion des évènements de la vue ? La réponse peut être simple mais je ne vois pas comment faire pour l'instant. Merci.

Commentaire de gaston_gb le 14/10/2009 01:47:30

Merci bien pour cet article ;)

Commentaire de gracevit le 14/10/2009 13:25:02

Merci bien pour ce tuto

Commentaire de neigedhiver le 16/10/2009 23:18:27

Ouaip, j'avais déjà lu ce tuto y'a un moment, et j'y reviens aujourd'hui, parce que depuis l'année dernière, j'ai jeté un oeil à Zend, Sympfony (je les ai juste regardés de très loin, j'ai vraiment pas été emballé), mais aussi à CodeIgniter et Kohana... Et depuis, je me suis mis en tête de me faire mon framework (parce qu'on n'est jamais aussi bien servi que par soi-même, c'est à dire qu'on est forcément plus à l'aise avec du code qu'on a écrit plutôt que téléchargé).

Donc très bon tuto, qui mériterait à mon sens d'être un peu plus approfondi sur certains points. Notamment :
"A l'intérieur pas d'affichage et communication avec le contrôleur, seulement avec le router. On pourra y définir des zones dynamiques, ou bien l'emplacement prévu pour la page."
Dans cette phrase, jusqu'au mot "contrôleur", je vois très bien, mais après, c'est un peu flou : je ne vois pas une manière de faire, mais ça me laisse trop de portes ouvertes sur ce qu'il est possible de faire. Et j'aurais aimé savoir ce qu'en pense l'auteur dont j'apprécie généralement les contributions sur ce site ;) C'est de la lecture très enrichissante à chaque fois, donc, j'aimerais être un peu plus riche ^^

Commentaire de mina1206 le 08/01/2010 12:22:32

Bravo!!
en lisant votre tuto au moins je sais comment ça fonctionne maintenant!!
Cordialement

Commentaire de sunnov le 10/04/2010 12:36:12

Trés bien
question:des tutoriaux a propos de zend framework.

Commentaire de begueradj le 12/06/2011 15:25:00

il faut du code, travailler sur un petit exemple illustratif pour donner du sens à la littérature

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales