Parmi les choses les moins comprises parmi le pattern et les frameworks MVC ( Tout framework confondu, en Php, Java, MS.Net, … ) se trouve les différences entre les modèles, ce que représentent les modèles, et les cas d’utilisation vis à vis de ces modèles….
Dans le pattern MVC, nous retrouvons le Modèle, la Vue et le Contrôleur, certes, mais dans une requête de formulaire, est-ce bien uniquement le cas ?
Et bien pas tout à fait !
- Dans le schéma ci-dessus, la requête émane de la vue au moment ou l’utilisateur poste ses données ( Input View )
- Cette vue génère un modèle, que nous pouvons appeler « Input Model », « InputForm », « Modèle In » ( le terme que j’utilise personnellement ), …
Ce modèle est transmis à l’action de votre contrôleur - Ce contrôleur traitera avec la couche métier, service, … et transmettra des données ( nous y reviendrons )
- En résultat, cette même action devra générer un jeu de données qui sera affichée par la vue résultante de cette requête. Ces données sont stockées dans un modèle également ! ( ViewModel, Output Model, Model out, … ) –
Attention ! L’usage d’autres canaux pour transmettre des données comme le titre de la page, des données de format, … devrait aussi se trouver dans le modèle ! Si nécessaire, constituer une métaclasse pour transmettre votre modèle ( Domain model par exemple ) et les autres données… – il n’est pas conseillé d’utiliser les variables de session, d’instance, ViewBag, … pour cet effet. - La vue finale ( Ouput View, Result View, … ) utilisera ce ViewModel pour afficher les données dynamiques.
Les modèles sont identiques, doivent être identiques, peuvent être identiques, ou ne sont jamais identiques ?
La réponse…. ça dépends ! 😉
D’une part, est-ce que les données qui transiteront seront identiques ? Généralement, non.
- Si les données ne sont pas identiques, alors les classes de modèles sont différentes 🙂
Mais si la structure des données est identique ?
Par exemple, les données du formulaire ( Input model ) doivent être à nouveau affichées sans autre information ( Input Model => View Model ),
Ou les Entités ( classes de domaine qui représentent des données de la base, voir le pattern ORM ) peuvent être utilisées telles quelles dans la vue résultat ( Output View )
- Si les structutres sont identiques, alors deux possibilités !
- Une solution « de rigueur », mais un peu lourde : Qu’à cela ne tienne, le View Model sera toujours différent du Domain Model ! Cette solution suit les conventions, mais implique du travail de conception, et d’exécution… ( conception en double des classes, copie des données, … )
- Une solution « souple et facile » : Réutilisons le modèle de domaine, les entités, et passons-les telle quelles dans la Output View. Solution simple qui utilise les couches transverses, génère un couplage fort, ….
N’hésitez-pas à me contacter si vous avez toujours des questions à ce sujet 😉
Vous devez être connecté pour poster un commentaire.