|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() |
Bonjour,
Je suis aujourd'hui confronté à un débat avec certains de mes collègues sur la meilleur façon d'implémenter la partie MVC dans ma société. Cette problématique est au niveau de la vue et de classes métiers (qu'ils considèrent être lié au controller). Prenez l'exemple de l'implémentation en PHP du fameux jqgrid. Nous avons donc là deux écoles : - la première disant que tout ce qui est à la vue doit être écrit dans la vue (ou à la rigueur dans un helper de vue mais là dessus pas encore certain) - la seconde, disant que dans la vue nous pouvons faire un simple 'echo" de l'objet qui utilisera la fonction _toString() qui est pour moi là pour ca. Effectivement la seconde solution lie quelque peu la partie vue et métier. Mais en mon sens, la vue dit bien qu'il faut afficher un tableau, et c'est la classe métier qui va elle générer comme il se doit le tableau. Pour la seconde, aucune génération en PHP, pas de classe PHP manipulant le Tableau, tout est dans la vue. Ce problème peut se retrouver aussi dans d'autres composants, à savoir le Zend_Form qui propose des décorateurs permettant la génération via un simple echo dans la vue d'un formulaire pouvant être complexe. La dessus aussi bien entendu ils sont contre car ils considèrent que cela n'est pas géré dans la vue et donc que l'on est pas MVC. Merci donc de prendre le problème dans son ensemble et de ne répondre que si vous avez un avis très conceptuel de la chose, le but n'étant pas d'avoir des opinions personnelles, mais plutôt conceptuelles sur les bonnes pratiques à ce niveau là. Merci d'avance pour vos lumières sur ce point |
|
|
00
|
|
|
#2 |
![]() ![]() Gérard ErnaelstenDBA & Dev PHP Inscription : juin 2005 Messages : 3 177 ![]() |
PHP n'est pas là pour manipuler le HTML.
On doit séparer le code PHP de HTML, donc la vue doit rendre uniquement le contenu, d'ailleurs le code PHP d'une vue ne doit permettre que de faire des parcours tableaux ou echo de variables, le tout bien entendu géré dans les controller et model. Utilisateur intensif de ZF, je suis d'accord (heu oui c'est personnel) avec le fait que Zend_Form n'est pas MVC, je ne l'utilise jamais (trop d'heures perdue pour un simple formulaire). Je me rangerais donc du côté de tes collègues !
__________________
Il faut toujours viser la lune, car même en cas d'échec on arrive dans les étoiles. O.Wilde Mes Articles/Critiques : Merise - Guide pratique PHPExcel PostgreSQL : Administration et exploitation d'une base de données PostgreSQL : Entraînez-vous à créer et programmer une base de données relationnelle |
|
|
10
|
|
|
#3 | |
|
Expert Confirmé
![]() ![]() |
Euh, je pense qu'il ne faut pas être aussi restrictif. Il ne faut pas quand même oublier qu'une page web ce n'est que du texte. Donc ce n'est pas un non sens que d'utiliser PHP pour produire du texte à la volée, texte avec un formatage particulier certes, mais du texte quand même.
Après, séparer le HTML du PHP c'est une bonne pratique qui est à recommander fortement. Citation:
La place de la vue est en bout de chaîne. La vue ne fait rien d'autre que générer du code qui sera envoyé au client à partir des paramètres qui lui sont spécifiques. Le code à générer peut être du HTML, XML, PDF.... Dans notre framework, une vue peut faire appel à d'autres vues mais à aucun autre type de composant. Par corrélation, on ne dérive pas les vues les unes des autres (pas de décorateur), les vues se résument à des briques individuelles assemblables les unes aux autres pour composer des rendus très complexes. Enfin, une vue ne fait que générer du code et rien d'autre (en particulier aucun envoi).
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
|
00
|
|
|
#4 | |||
|
Nouveau Membre du Club
![]() |
Citation:
- du contrôle de droit - on implémente des règles métier selon tel ou tel paramètre - etc. Pour ma part, je suis pas en désaccord avec mes collègues, mais je serais plus souple. Zend_Form n'est pas réellement MVC (même s'il a des helper de vue qui font la génération HTML) mais pour moi il correspond à un besoin (et une fois le système compris cela va réellement bien crois moi, mais faut le comprendre...). Il en va de même pour d'autres composants la jonction entre Vue et Controller est infime et complexe car : - qui gère les inclusions de scripts dont on a besoin dans la vue ? - qui gère l'affichage ou non de portions de codes ? Est-il nécessaire de faire plusieurs vues gérées par le controller pour réellement respecter le concept MVC ? Si on veut du vrai MVC, avec une vue ne gérant que la présentation des données, on en revient inévitablement à une multitudes de fichiers appelés ou non par le controller... ou on crée des helper de vue utilisés par le Zend_Form. Pour moi il y a une notion entre respect à 100% du concept et gain en temps (par exemple, peut-on dire que Smarty, générateur de template HTML assez reconnu, appartient à la vue ? Pour moi non Mais malgré tout, je reste d'accord avec une personne qui me dit que conceptuellement un MVC, pour la partie vue c'est purement de la présentation. Après en réalité, il faut bien enrober cela car sinon cela nous ferait plus de travail / fichiers à maintenir que de gain réel apporté. Citation:
Citation:
- gain important + réutilisabilité + maintenabilité contre : - duplication de la fonction dans chaque vue Au final, il semblerait qu'on soit arrivé à un consensus au niveau des aides de vue. Une classe, pour quelque rendu que ce soit (HTML, JavaScript, etc) doit passer par des helper. Il me semble que ce soit une bonne pratique mais surtout un bon compromis entre respect des règles MVC et optimisation / réutilisation du code. Qu'en pensez vous ? |
|||
|
|
00
|
|
|
#5 | |||
|
Expert Confirmé
![]() ![]() |
Citation:
Voici un squelette de la gestion de cette problématique : Code :
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|||
|
00
|
|
|
#6 | |||
|
Nouveau Membre du Club
![]() |
Citation:
Un helper de vue comme le headScript de Zend ne gère que la partie scripts, et faire une classe de gestion de scripts reviendrait au même Un exemple : Code :
Donc séparation mais utilisation de classes (helper, classes de rendues, Smarty, etc.) qu'ils mettaient au départ comme appartenant à un controller (classe = C ou M et non V) mais à mon avis et d'après ce qui se dit au final, il y avait une incompréhension au niveau de classes de rendu (quelque soit leur rôle). |
|||
|
|
00
|
|
|
#7 |
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
Vous pouvez éventuellement voir l'évolution de mentalité pour ce qui concerne la Vue dans le Zend Framework après les retours d'expérience sur la version 1.
C'est édifiant : http://framework.zend.com/wiki/displ...ilestone%3AMVC
__________________
|
|
|
00
|
|
|
#8 | |||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Pour ma part, ce n'est pas de la responsabilité du contrôleur de "paramétrer" les vues mais seulement de préparer les données. Normalement, il faut être capable de refondre totalement les vues sans jamais toucher au contrôleurs. De même qu'il faut être capable de changer la couche de modèle sans changer le métier. C'est le principe d'isolation qui est le plus important ici car c'est lui qui apporte une réelle plus-value au paradigme MVC. Citation:
Parfois, il est plus intéressant de dupliquer comme tu dis si les besoins sont différents. Je ne remets pas en question le principe DRY mais je pense qu'il faut aussi tenir compte du KISS. Citation:
Donc je suis revenu vers une approche plus naturelle ou pour chaque besoin d'affichage, une vue supplémentaire est produite (par exemple: list_products.html.php pour du HTML et list_products.json.php pour JSON). Au final c'est plus performant et plus adapté à la RAD. De plus, ça couvre tout à fait mon besoin et c'est finalement la seule chose qui compte: une solution élégante est une solution simple à écrire et à comprendre
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||
|
00
|
|
|
#9 | |
|
Nouveau Membre du Club
![]() |
Citation:
Au final, si l'on veut, dans le ZF1, respecter cet adage, il me semble qu'il serait nécessaire de : - Ne plus utiliser les décorateurs, car si modification de présentation => modification du Form SAUF si mis en place dans la vue puis rendu (intérêt ? Pas certain) - Eviter autant que possible finalement les aides d'action manipulant le Header de la vue (réponses Ajax avec définition du format par exemple) car effectués au niveau du contrôleur - N'utiliser des aides de vues qu'au niveau du rendu de la vue et non lorsque l'on est encore au niveau du controlleur - Préparer TOUTES les données pour la vue SAUF cas particulier (parfois tout préparer en terme d'utilisation mémoire / performance n'est pas le meilleur, il est parfois nécessaire de récupérer les données en même temps qu'on les formate dans la vue) - Etc. Il est vrai qu'avec cette solution il y aura forcément de la duplication, car mon souhait au départ était l'uniformisation des applications (formulaires, Tableaux, etc.) ce qui est possible puisque je le fais dans mes applications. Mais si on veut réellement implémenter une solution dite MVC, autant à minima bien séparer cette couche même si cette séparation risque dans certains cas ne pas être possible dû : - à des problèmes de droit (et encore, bien penser on peut construire des objets complets initialisés en fonction des droits, ce qui résout le problème...) - à des problèmes de performance / utilisation mémoire Merci s.n.a.f.u pour le lien, je l'ai lu et leur conclusion c'est que leur implémentation MVC est très souple et peut être trop souple Cela fera l'objet d'un autre débat si certains veulent en discuter, pour ma part j'ai mes réponses qui me semblent cohérentes vis à vis de tout ce qui s'est dit Merci beaucoup à vous tous pour vos retours enrichissants |
|
|
|
00
|
|
|
#10 | |||||||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Citation:
Citation:
Citation:
Une vue pourrait être amenée à charger indirectement un modèle en utilisant une méthode d'un objet renvoyée par le contrôleur, ce n'est pas un grand mal selon moi. En revanche, il est totalement exclu que la vue puisse instancier explicitement (new ou autre) une classe de modèle. E.G. Code :
Note: cet usage présente un inconvénient majeur, lors qu'une exception est levée au sein de la vue, le contrôleur ayant déjà fini son travail (la vue est toujours invoquée en fin de chaine) il devient impossible de manipuler la réponse HTTP pour renvoyer, par exemple, une erreur 500. Citation:
Citation:
Citation:
J'ajouterai enfin que le MVC est incomplet: il n'y a pas de couche métier prévue par exemple. Il est avantageux selon moi de le coupler avec une architecture mutlitiers (ou 3tiers) plus classique.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||||||||
|
00
|
|
|
#11 | |||||
|
Nouveau Membre du Club
![]() |
Bonjour benjamin,
Citation:
=> On fait dans une classe ce qui devrait être effectué dans une vue. Citation:
![]() En ce qui concerne ta fonction appelée dans ta vue, je suis aussi d'accord, c'est bien une classe "métier" (fonctionnelle, d'accès aux onnées, etc.) qui va récupérer les données, c'est un minima, le must étant de le gérer dans le contrôleur Citation:
=> dans ta vue tu vas contrôler une variable pour savoir s'il faut afficher ou non le bouton de suppression Seconde solution (pour un objet Form), tu gère les éléments autorisés à être affichés, et la vue gère ce qui lui est renvoyé. Pour ce qui est des droits d'actions, effectivement, c'est le rôle de l'ACL et à ce niveau là c'est fort bien géré Citation:
=> pour 100 000 enregistrements, calcule l'utilisation mémoire Ceci n'est qu'un exemple, mais parfois de vouloir tout initialiser avant, on arrive dans certains cas (récupération de milliers d'enregistrement avec calcul / moyennes etc) de plomber les performances. Mais effectivement, c'est des cas ciblés, la majeur partie du temps nous n'avons pas de problèmes de performance à ce niveau là. Citation:
Merci en tous cas pour ton partage d'opinion
|
|||||
|
|
00
|
|
|
#12 | |||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
L'avantage à disposer d'un itérateur c'est que non seulement un peut se "promener" dans le jeu de résultats mais surtout qu'on peut le décorer à nouveau avec des filtres, des limiteurs etc. Voici concrêtement à quoi ça ressemble: Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||
|
00
|
|
|
#13 |
|
Nouveau Membre du Club
![]() |
Oui, mais tu es d'accord avec moi, tu vas initialiser un Objet au niveau du contrôleur, le passer à ta vue, et cet objet va gérer le rendu
=> C'est cela que me reprochent mes collègues car ils considèrent que cet objet fait tout ![]() Pour eux c'est un autre objet qui doit gérer dans tous les cas le rendu... mais parfois je trouve cela plus simple d'utiliser la fonction __toString() d'un objet même s'il a été instancie à partir du Contrôleur, et même s'il gère à la fois la récupération des données et son rendu. Mais encore une fois c'est peut être moi qui extrapole puisque ma super classe gère aussi : - le rendu du Tableau (JqGrid en PHP) - le rendu du formulaire associé (on lui donne une classe DbTable, il génère le reste => gain de temps pour des tables d'administration monstrueux - la récupération des données et le formatage XML / CSV / JSON Bref un vrai monstre, et à mon avis c'est surtout cela qu'ils reprochent à cette classe Mais là on relance le débat (qui ne sera jamais clos ^^) |
|
|
00
|
|
|
#14 | |||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Citation:
Citation:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||
|
00
|
|
|
#15 | ||
|
Nouveau Membre du Club
![]() |
Citation:
Citation:
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com