Les frameworks MVC (Model View Controller) et les applications web
Francescu SANTONI | Mardi 22 Juillet 2008
Cette article explique l'utilité de l'architecture MVC dans les applications web et vous donne les bases pour faire votre propre Framework adapté à vos besoins...
Les grandes lignes de la théorie
L'architecture MVC (pattern d'architecture plus exactement) est un concept qui sépare votre application en trois types de fichiers principaux :
les Modèles qui représentent vos objets logiques (ou métiers) : ils seront manipulés par les Controllers ou les Views, mais ne manipuleront jamais ces derniers les Controlleurs qui s'occupent des opérations entre les models, des modifications, du traitement des données utilisateurs, etc... Ce sont les actions métiers de votre application (à ne pas confondre avec les actions métiers de vos objets!!) les Vues qui se contentent d'afficher les formulaires, les résultats ou tout autre type de page affichée à l'utilisateur
les Modèles qui représentent vos objets logiques (ou métiers) : ils seront manipulés par les Controllers ou les Views, mais ne manipuleront jamais ces derniers les Controlleurs qui s'occupent des opérations entre les models, des modifications, du traitement des données utilisateurs, etc... Ce sont les actions métiers de votre application (à ne pas confondre avec les actions métiers de vos objets!!) les Vues qui se contentent d'afficher les formulaires, les résultats ou tout autre type de page affichée à l'utilisateur
Ce qu'il en est aujourd'hui
S'il est vrai qu'à l'origine le concept de l'architecture MVC était assez basique (presque un simple système de rangement), aujourd'hui ce n'est plus le cas. Depuis l'apparition du framework Ruby On Rails puis des plus récents CakePHP et Symphony, la notion de framework MVC a évolué chez la plupart des gens.
En effet, que l'on considère que ce soit par un abus de langage ou par une évolution, on attend aujourd'hui d'un framework MVC (pour les applications web) qu'il contienne les éléments suivants :
L'organisation MVC proprement dite Un système d'url propres, cohérentes et comprénsibles par l'homme L'intégration d'un framework javascript pour une ergonomie riche et des effets agréables Un système de mapping semi-automatique "objets <=> base de données" La gestion de plusieurs templates pour les vues Des systèmes permettant l'aide au développement (helpers) Cet article n'aura pas pour but de rentrer dans les détails d'une implémentation technique mais de montrer un point de vue des différents concepts existants afin que vous compreniez la puissance mais également la simplicité de tels framework et que vous ayez les connaissances suffisantes pour vous lancer et faire votre propre framework.
En effet, que l'on considère que ce soit par un abus de langage ou par une évolution, on attend aujourd'hui d'un framework MVC (pour les applications web) qu'il contienne les éléments suivants :
L'organisation MVC proprement dite Un système d'url propres, cohérentes et comprénsibles par l'homme L'intégration d'un framework javascript pour une ergonomie riche et des effets agréables Un système de mapping semi-automatique "objets <=> base de données" La gestion de plusieurs templates pour les vues Des systèmes permettant l'aide au développement (helpers) Cet article n'aura pas pour but de rentrer dans les détails d'une implémentation technique mais de montrer un point de vue des différents concepts existants afin que vous compreniez la puissance mais également la simplicité de tels framework et que vous ayez les connaissances suffisantes pour vous lancer et faire votre propre framework.
L'organisation MVC
Elle dépend fortement de vos besoins, mais est généralement composée comme ci-dessous.
L'application marche en termes d'actions effectuables regroupées au sein de différents controllers.
Par exemple, une bibliothèque manipulerait les objets (Models) Livre, CD, DVD, Location et Utilisateur.
Sémentiquement on pourrait par exemple décomposer les actions en deux controllers:
Bibliothèque (avec les actions louer, rendre etc...) et Membres (avec nouveau, modifier etc..)
Pour les vues, on peut faire une plateforme où chaque action a une vue correspondante ou bien une plateforme où les vues sont réalisées de façon indépendantes et appelées par les actions (par exemple à la fin de celle-ci).
La deuxième solution me semble bien plus modulaire dans le sens où deux actions peuvent afficher la même vue et qu'une action pourra afficher (selon les données d'entrée) des vues différentes.
L'application marche en termes d'actions effectuables regroupées au sein de différents controllers.
Par exemple, une bibliothèque manipulerait les objets (Models) Livre, CD, DVD, Location et Utilisateur.
Sémentiquement on pourrait par exemple décomposer les actions en deux controllers:
Bibliothèque (avec les actions louer, rendre etc...) et Membres (avec nouveau, modifier etc..)
Pour les vues, on peut faire une plateforme où chaque action a une vue correspondante ou bien une plateforme où les vues sont réalisées de façon indépendantes et appelées par les actions (par exemple à la fin de celle-ci).
La deuxième solution me semble bien plus modulaire dans le sens où deux actions peuvent afficher la même vue et qu'une action pourra afficher (selon les données d'entrée) des vues différentes.
Des Url bien plus propres
Le cas du paragraphe précédant nous donnerait une application dans le genre http://bibli2008.com?controller=membres&action=editer&id=5646
La plupart des frameworks MVC (mais ce ne sont pas les seuls) intègrent un système de gestion des URL de façon propre du type : http://bibli2008.com/membres/editer/5646 voire privilégier des permaLinks pour les utilisateurs http://bibli2008.com/francescu/editer.
Grace à Apache, cela est réalisable de deux manières :
directement dans votre .htaccess avec chaque cas décomposer les paramètres de l'url dans l'index.php (après avoir pris soin de tout rediriger vers cette page) Dans les deux cas il vous faudra gérer en PHP dans votre index.php le routage des requêtes.
La plupart des frameworks MVC (mais ce ne sont pas les seuls) intègrent un système de gestion des URL de façon propre du type : http://bibli2008.com/membres/editer/5646 voire privilégier des permaLinks pour les utilisateurs http://bibli2008.com/francescu/editer.
Grace à Apache, cela est réalisable de deux manières :
directement dans votre .htaccess avec chaque cas décomposer les paramètres de l'url dans l'index.php (après avoir pris soin de tout rediriger vers cette page) Dans les deux cas il vous faudra gérer en PHP dans votre index.php le routage des requêtes.
Du Javascript pour des interfaces presque riches
Je me contenterai de vous dire qu'il existe une grande diversité de framework Javascript et qu'il n'est pas forcément intéressant (en rapport temps/gain) de faire sa propre librairie. En effet, celles existantes permettent de charger ce dont vous avez besoin, sont de taille assez modeste et sont assez complètes.
Se distinguent nottemment les librairies suivantes :
le couple Prototype (Ajax, Dom etc..)/Scriptaculous(Effets, éléments graphiques etc..) jQuery qui est assez puissant Dojo qui va très loin Ext qui est assez lourd mais qui peut générer un système d'interface graphique complet la liste est encore longue (Google Web ToolKit, Yahoo UI, MooScript etc..) et de nombreux comparatifs sont disponibles (vous les trouverez avec une petite recherche google)
Se distinguent nottemment les librairies suivantes :
le couple Prototype (Ajax, Dom etc..)/Scriptaculous(Effets, éléments graphiques etc..) jQuery qui est assez puissant Dojo qui va très loin Ext qui est assez lourd mais qui peut générer un système d'interface graphique complet la liste est encore longue (Google Web ToolKit, Yahoo UI, MooScript etc..) et de nombreux comparatifs sont disponibles (vous les trouverez avec une petite recherche google)
De vos «Tables SQL» à vos «Classes PHP»
Comme le fait Ruby On Rails, les frameworks MVC proposent des outils vous permettant de faire abstraction du système de gestion de base de données (SGBD) et de gérer vos objet comme si vous manipuliez vos enregistrements (le tout optimisé avec un système de cache).
Cela se nomme l'Object-Relational Mapping (ORM), cela "convertit" les types du monde objet (poo) en ceux du monde relationnel (bdd) et vice versa. Cela fournit également des facilités d'enregistrement, de suppression et de modification.
L'implémentation est assez technique mais si vous êtes motivés quelques semaines de travail acharné vous permettront de faire le votre sans grands problèmes impossibles à résoudres (quelques problématiques devront être résolues mais vous y arriverez certainement). Sinon vous trouverez quelques Frameworks ORM sur la page Wikipedia (fr).
Cela se nomme l'Object-Relational Mapping (ORM), cela "convertit" les types du monde objet (poo) en ceux du monde relationnel (bdd) et vice versa. Cela fournit également des facilités d'enregistrement, de suppression et de modification.
L'implémentation est assez technique mais si vous êtes motivés quelques semaines de travail acharné vous permettront de faire le votre sans grands problèmes impossibles à résoudres (quelques problématiques devront être résolues mais vous y arriverez certainement). Sinon vous trouverez quelques Frameworks ORM sur la page Wikipedia (fr).
Des petits plus...
Il existe également dans les frameworks des petits plus qui vous permettront de gérer facilement les templates (qui certes sont assez simples à mettre en place, mais c'est une étape à ne pas oublier car elle est très importante) ou encore d'avoir des helpers, sortes de "fonctions raccourcis".
Par exemple mettre un champs de texte dans une formulaire
<?php Form::inputText(array("name" => "X", "style" => array("width" => "30px", "border:none"))); ?>
ou transformer une date anglaise en format français
<?php Date::EnToFr(date("Y-m-d")); ?>
N'hésitez pas à en abuser mais n'hésitez pas non plus à ne les charger qu'en cas de besoin (cf. la fonction __autoload )
Par exemple mettre un champs de texte dans une formulaire
<?php Form::inputText(array("name" => "X", "style" => array("width" => "30px", "border:none"))); ?>
ou transformer une date anglaise en format français
<?php Date::EnToFr(date("Y-m-d")); ?>
N'hésitez pas à en abuser mais n'hésitez pas non plus à ne les charger qu'en cas de besoin (cf. la fonction __autoload )
Pour conclure
La création de votre propre plateforme sera longue mais de nombreux outils sont là pour vous faciliter la tâche. Vous pouvez choisir de partir à zéro ou d'utiliser un framework déjà existant (CakePHP ou Sympony par exemple) mais vous pouvez également opter pour une solution intermédiaire, qui est de prendre ce qui vous intéresse et de faire ce qui est unique pour votre propre framework, vous aurez alors un framework adapté que vous maîtriseriez sur le bout des doigts.
Tags :
Vidéos similaires
Recherche