Vous êtes sur la page 1sur 9

7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka

ka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 1/9
Design Pattern MVC zoom sur la
couche modle : DAL / DAO / ORM /
CRUD
Posted on 17 janvier 2010 by mazenovi
Design Pattern MVC
Voil deux ans que je fais un cours, suivi dun petit projet traitant du design Pattern MVC.
Le projet est crire en PHP5, avec une base de donnes MySQL comme support de stockage des
donnes, larchitecture MVC est donc implmenter dans un contexte purement web. Le paradigme
objet est tout indiqu quand il sagit dcrire et dagencer des composants logiciels, cest donc celui qui
sera adopt dans toute la suite.
Il y a bien entendu beaucoup de projets existants implmentant le design Pattern MVC en PHP, mais le
propos du cours est plutt de raliser un cas pratique dimplmentation afin de bien saisir les bien faits
du design pattern MVC.
En effet lutilisation dun design pattern architectural en PHP, soppose la pratique empirique de ce
langage qui consiste mlanger les connexions et accs la base de donnes, avec le traitement des
donnes et leur affichage. Dans ce cas il est alors commun davoir dans un seul script: du PHP, du SQL,
du Javascript et du CSS dans les attributs des balises HTML soit pas moins de 5 langages distincts.
Au mme titre quil est conseill dans la prsentation de sparer lHTML, qui structure le document, du
CSS, qui lhabille, il est conseill dutiliser un design pattern architectural pour structurer une application
web.
Pour mmoire cette architecture permet dorganiser une application en 3 couches distinctes savoir :
le modle, qui contient la logique mtier;
la vue, qui regroupe tout ce qui a trait la prsentation (des donnes / comme des interactions
utilisateur);
le contrleur, qui rpond des interactions utilisateurs en provenance de la vue, en appelant des
traitements mis disposition sous forme de mthode par le modle, afin de nourrir la vue associe au
traitement demand par lutilisateur.
7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 2/9
Si vous pratiquez PHP et navez jamais utilis le design pattern MVC, je vous recommande la lecture de :
comment convertir une application PHP standard en une application base sur larchitecture MVC .
Le propos de ce billet nest pas de vanter les mrites du design pattern MVC, car ils sont en gnral
bien compris par mes tudiants. Cest plutt den dtailler la couche modle dont la structure est assez
dure dissquer. Jai moi-mme pas mal lu et beaucoup dbattu, avec le camarade will
durand notamment, avant darriver isoler chaque composant de cette couche.
le Modle
Sous sa forme la plus brute, la couche modle peut tre vu comme les donnes . Par donnes on
entend tout ce qui est persistant, cest--dire tout ce quon pourra lire partir dune source, et modifier
pour le relire plus tard si besoin est. Dans une logique de dcouplage, il est de bon ton dessayer de
saffranchir le plus possible de la forme brute des donnes. Cest ce que va faire le modle en
transformant des donnes brutes en objets structurs, utilisables simplement par la couche infrieure :
le contrleur.
7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 3/9
Pour raliser ce dcouplage le modle utilise 3 couches dabstraction :
La DAL (Data Access Layer) : couche abstraction de donnes
Le DAO (Data Access Object) : objet daccs aux donnes
LORM (Object / Relation Mapping) : Mapping objet / relationnel
Pour lexemple je vous propose de partir du diagramme UML suivant
qui donne le MLD (schma de base de donnes) suivant
7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 4/9
La DAL
La DAL Permet de sabstraire du support des donnes. Pour se faire elle met disposition des
mthodes gnriques permettant daccomplir des actions de maintenances sur les donnes. Les actions
les plus communes sont regroupes sous lacronyme CRUD (Create Read Update Delete). Basiquement
la DAL va donc mettre disposition des mthodes permettant dajouter, mettre jour, lire, supprimer un
enregistrement, et ce quelque soit le support de stockage des donnees.
La gnricit par rapport au stockage est en gnral matrialise par un paramtre permettant de
spcifier la nature du support (on appelle a des drivers). Ainsi les mthodes CRUD associes au
support de stockage sont utilises de manire transparente par le dveloppeur. Concrtement il ny a
donc en thorie quun paramtre changer pour quune application utilisant une DAL puisse changer
de support.
Dun point de vue strictement thorique la DAL devrait offrir la possibilit de maintenir des donnes
dans nimporte quelle base de donnes, dans des fichiers texte, dans des fichiers xml
Dun point de vue pratique, en PHP, une DAL utilise toujours un SGBD. Son rle est donc de rendre
lapplicatif qui lutilise (la DAL) portable par rapport au SGBD utilis.
Les DAL PHP que je connais sont Pear DB (la premire que jai utilis), Creole, et PDO qui tend
devenir le standard en PHP, puisque disponible sous forme dextension PHP.
7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 5/9
Le DAO
Le Dao a pour but de transformer les donnes contenues dans une bases de donnes en objets et
inversement
Pour se faire il va faire correspondre (de manire bijective ca veut dire quon peut rajouter et
inversement la fin de chacun des points suivants)
une table (appele aussi relation) une liste dobjets
une ligne dune table (appele aussi tuple) un objet
un champs de base de donnes un attribut dobjet
une valeur dun champs une valeur dattribut dun objet
Dans notre exemple les classes issues du DAO seront au minimum
je dis au minimum, car ces classes pourraient avoir un peu plus de classe! avec des getters et des
setters.
Techniquement la DAO interroge le SGBD via la DAL sur la structure des tables afin de maintenir la
correspondance entre les champs des tables de la base de donnes et les attributs des objets. Il y a au
7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 6/9
moins deux faons de raliser cel:
soit en gnrant un code PHP minimale fonction de la structure de la base de donnes (il faudra alors
regnrer chaque modification du schma de base de donnes).
soit en utilisant les mthodes magiques PHP (comme __get, __set ou __call et ___callStatic) et le late
static binding de PHP 5.3
Notez qu ce niveau l le seul code logique que possde les objets construits partir dun DAO sont
les mthodes CRUD qui vont permettre daller le lire, le modifier, le supprimer en base. En cela les
objets issus dun DAO pourraient tre appels des POPO (rigolez pas! cest pas moi qui lai dit le
premier) par analogie auxPOJO Java (Plain Old Java Object)
Notez galement que dans le schma de prsentation des couches dabstraction du modle, le DAO
utilise la DAL, mais que ce nest pas une vraie obligation : un DAO hardcod en mysql resterait un DAO
simplement non portable au niveau du SGBD.
Notez enfin que chaque classe est isole, cest dire quil nexiste pas de code logique qui permette une
quelconque interaction entre elles.
LORM
LORM a pour but de transformer les relations entre les tables d une base de donnes en relations
entre objets et inversement
Elle va typiquement se proccuper de matrialiser les cls trangres par des dpendances entre
objets
7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 7/9
Lintrt rside dans le fait que les mthodes de la couche ORM, renvoient ou prennent en paramtres
des listes dobjets. Par exemple $post->getComments() renverra une liste dobjets de classe Comment.
Ces objets Comment seront sous forme de POPOS, cest en cel que lORM utilise le DAO.
Techniquement lORM utilise soit les contraintes dintgrit rfrentielle, soit une certaine logique de
nommage, pour dterminer les cls trangres. Dans les deux cas elle passe par la DAL.
Comme pour le DAO, les stratgies de gnration de code ou dutilisation des mthodes magiques
peuvent tre adoptes.
Comme pour le DAO galement, lutilisation dune DAL est conseille mais pas obligatoire.
propel et doctrine sont deux ORM PHP typiques.
La couche mtier
Le but des couhes prcdentes est de soulager la couche mtier. Si la couche mtier peut hriter des
mthodes de la DAO et de lORM, nous aurons des objets prsentant toutes les mthodes pour les
grer en base.
7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 8/9
La couche mtier est sense ne contenir que la logique mtier, cest dire propre lobjet quelle
reprsente. Ce sera effectivement le cas dans la class Post par exemple, o lon pourra navoir quune
seule mthode Post::getArchives(), qui retourne une liste de liste contenant les archives du type
Array(
'2009' => Array('janvier' => 1),
'2008' => Array('septembre' => 7, 'octobre' => 2, 'novembre' => 1, 'dcembre' => 1)
)
Cette mthode fait bien parti de la couche mtier puisquelle est propre au concept de post (ou billet) de
blog.
7/9/2014 Design Pattern MVC zoom sur la couche modle : DAL / DAO / ORM / CRUD | Vincent Mazenod (aka mazenovi)
http://blog.mazenod.fr/2010/01/design-pattern-mvc-zoom-sur-la-couche-modele-dal-dao-orm-crud/ 9/9
En appelant cette mthode le contrleur pourra nourrir une vue qui naura alors quun double foreach
faire pour prsenter les archives dans le menu de droite.
conclusion
Les concepts que je viens de dtailler sont souvent amalgams, aussi il est souvent difficile de les
cerner prcisment. Jai essay dillustrer le rle de chacun par un exemple simpliste, mais je ne
prtends dtenir aucune vrit sur le sujet et les commentaires sont ouverts pour accueillir vos
questions, suggestions et corrections
le mld a t gnr avec DBDesigner4 et tout les diagrammes uml ont t gnrs avec yUML
Be Sociable, Share!