|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Salut à tous,
Je m'interroge quant à la meilleur façon de gérer les entrée utilisateur (GPC) dans un modèle MVC. Dans l'absolue je récupère par exemple mes données $_POST dans l'action du controller , je passe ensuite ces données au modèle via les paramètres. Mais quid du traitement des données ? Si par exemple j'ai besoin de vérifier la syntaxe d'un email avant de le sauvegarder je vais faire ça dans l'action puisque cela va conditionner l'appel ou non au model. Mais admettons que j'ai besoin de formater les données avant de les insérer dans une base. Est ce que je fait ce formatage dans l'action , dans une méthode privée du controller ou carrément dans le model puisque au final ce formatage est directement liées au besoins du model ? D'après mes lectures la théorie voudrait que tout soit fait dans l'action mais dans certain cas on à vite tendance à se retrouver avec des controller monstrueux justement à cause des données utilisateur très importante ou nécessitant beaucoup de traitement. Je précise que j'utilise aucun framework spécifique c'est juste une interrogation global sur le sujet. |
|
00
|
|
|
#2 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Hello
J'y ai pensé mais je n'ai pas encore pondu de source correcte là dessus. En effet il est du rôle d'un contrôleur de valider les données, ça n'empêche pas pour autant l'instance de Request (ou l'équivalent chez toi) de faire le filtrage. La méthode à laquelle j'avais pensé serait d'utiliser filter_var_array en permettant aux contrôlleurs d'importer leur logique dans l'objet Request. Quelque chose comme ça pourrait faire l'affaire (même si c'est embryonnaire): 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
|
||
|
01
|
|
|
#3 | |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Citation:
Avec PDOStatement::bindParam ou PDOStatement::bindValue ça fait sens
__________________
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
|
|
|
01
|
|
|
#4 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Merci pour tes deux réponses. Je n'utilise jusqu'à maintenant pas de class "Request". Ca dévie un peu de la "norme" mais ça reste pour moi une surcouche pas forcément nécessaire.
Mais effectivement en y intégrant un filtrage des données ca prend du sens. Je resolve pas le sujet tout de suite defois que d'autres aient des avis divergents. |
|
00
|
|
|
#5 | ||
|
Expert Confirmé
![]() ![]() |
Salut,
@grunk : Excellente question :-) Je me suis déjà posé la même question il y a un bout de temps au moment du développement d'un framework PHP pour ma boite. Le plus simple est de contourner le problème en admettant qu'à priori tu ne sais jamais la somme des traitements qu'une action nécessitera ni quelle partie du code (controller, model, action) fera ces traitements. Donc le but est d'être capable de faire voyager ta donnée utilisateur à travers le modèle (ou toute autre partie du code, au développeur d'être bien organisé) en ayant la capacité de définir ce qui est nécessaire au bon fonctionnement du modèle et aussi de collecter les différents messages et erreurs que les traitements pourraient renvoyer. Le seul moyen est d'envelopper ta donnée dans une classe qui se charge de toutes ces tâches subalternes. Ainsi, la totalité des traitements ne manipule que des instances de cette classe (instance unique ou collection). Par extension, cette approche peut aller très loin : dans notre framework lors de la réception du POST, à chaque valeur récupérée on rattache via la classe enveloppante l'identifiant du contrôle graphique source de la valeur. On injecte le tout dans le modèle (ou la classe action) qui fait ses traitements et à la sortie on regarde si le collecteur d'erreurs rattaché à la classe a été mouvementé et si oui automatiquement le framework renvoie l'erreur qui se positionne en fonction de l'identifiant du contrôle graphique. En plus c'est assez léger car l'instance ne voyage que par référence. En conclusion, je pense qu'il n'y a pas de réponse idéale à ta question. Les interprétations du MVC sont légions donc à mon avis il faut parer à toutes les fantaisies. Allez pour étayer cette approche je vous propose le squelette allégé de la classe enveloppante : Code :
|
||
|
00
|
|
|
#6 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
J'aime beaucoup cette approche, je serais sûrement ammené à te l'emprunter un jour. Cependant, et je pense que c'est parce que tu ne nous mets pas toute la classe, j'ajouterai bien une capacité de filtrage / sanity ainsi qu'un factory (dans une autre classe) pour permettre d'aller plus vite.
__________________
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
|
|
01
|
|
|
#7 | |
|
Expert Confirmé
![]() ![]() |
Citation:
Par contre je ne pense pas que cela soit une bonne idée de rajouter une capacité de filtrage/sanity. Cette classe n'est pas faite pour ça. Elle propose des services à toute partie du code qui devrait la manipuler. Dans cette logique, tu dois avoir un Validator qui se charge de ta variable MyVar. Il fait son boulot et la renseigne au besoin si elle passe le test ou pas. La classe MyVar agrège et empile les résultats des tests passés (surtout ceux qui ne passent pas). Il y a un intérêt majeur à ça c'est lors de tests multiples. Si tu supposes que dans un champ tu aies des caractères interdits et une longueur max et que tu enfreignes les deux règles. Si la validation se fait à deux endroits distincts du code : tu ballades ta variable à travers tes 2 validateurs et tu récupères ainsi la double erreur. Cette approche s'explique car je sépare toujours la validation métier (caractères interdits) de la validation persistence (longueur max). |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com