Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je change de zone du forum maintenant que j'essaie de passer sur Zend3! Et au passage j'essaie d’arrêter toutes les mauvais habitudes que j'avais !
Donc une question que je me pose : La documentation préconise de mettre les inputFilter dans le Model. Cependant il est possible de les mettres aussi dans la class Form. J'ai du mal à voir ce que ça change.
Aussi dans mon cas j'ai des inputFilter dynamique, c'est à dire qu'ils sont dépendants d'une configuration particulière en BDD (essentiellement le required. En les mettant dans le form, je pouvais (en zf2) directement les récupérer via le ServiceManager alors que pas du tout dans le modèle.
Autre Solution : Je pourrais les envoyer dans le construct du Model.
Une de plus : Utiliser le setInputFilter mais dans le form ou le model ?
Je me pose la question sur la meilleur solution à mettre en place maintenant que je refactor un peu tout pour ZF3.
Merci à vous
Hors ligne
Salut,
De ce que je peux imaginer :
Si la documentation précise de mettre l'input filter dans ton model c'est surtout que si tu le met dans ton form tu peux coupler très fortement la manière de valider ton form avec ton métier. Et de ne plus pouvoir réutiliser ton formulaire ailleurs.
L'input filter peut filtrer un formulaire avec des règles très particulière parfois propre a ton métier. C'est donc aussi pour découper ton code et suivre le principe de responsabilité unique des objets. Un soucis d'architecture en somme.
Il y a également un principe de ré-utilisabilité tu peux vouloir créer des formulaires générique que tu réutilises dans tes projets et garder leur filtrage et validation spécifique à ton métier.
Dans ton cas ce concept s'applique ton form est très couplé à ta BDD donc ton model.
Ce que tu peux faire c'est déclarer ton formulaire en config
[lang=php] 'form_elements' => [ 'factories' => [ 'mon\Form' => 'Mon\Form\Factory', ] ]
De là en dépendance tu lui fourni ton modèle. Ce principe n'empêche pas une reutilisabilité de tes form si ton constructeur affiche des dépendances en typant des Interface par exemple.
Je pense que c'est ça mais ne peux te le confirmer.
Dernière modification par JGreco (20-04-2018 09:05:56)
Hors ligne
Hello,
Donc la solution c'est évidemment de ne pas lier ton modèle à ton input filter et donc à sa validation. C'est pas son rôle. De plus un modèle c'est une entité, elle doit être agnostique de tout framework et surtout être un objet "newable" mais l'idée c'est qu'il n'a pas de dépendances avec des gros objets qui nécessite de l'injection de dépendances (faut garder en tête que ses dépendances sont principalement des entités et/ou des values objects).
Ensuite ton formulaire doit être fait pour un cas d'usage et rien d'autre, si tu veux pouvoir réutiliser des choses il faut jouer avec les Fieldset et les validation group.
Concernant tes infos qui viennent de la BDD c'est pas gênant, rien t'empêches d'injecter un service ou un repository dans ton formulaire pour modifier son comportement. Il faut savoir que l'utilisation du ServiceManager / ServiceLocator dans des objets (autres que factory) est une mauvaise pratique, ce pourquoi on y a plus accès dans les contrôleurs dans la version 3 par exemple.
Donc pour résumer :
- Envoyer en dépendance du modèle : NON surtout pas. La raison est simple, demain tu veux instancier ton entité tu dois pouvoir le faire sans framework ni injection de dépendance. Et en plus de ça garder en tête que ton objet doit être valide après l'avoir instancié et donc ne pas avoir à chainer X setter pour le "remplir"
- Utiliser le setInputFilter => bad idea, de mémoire tu as une méthode getInputFilterSpecification dans le form et c'est ce qu'il faut utiliser.
- Injecter tes dépendances directement dans ton formulaire
Hors ligne
Salut,
Merci pour vos réponses.
C'est tout à fait ça, les valeurs possibles des formulaires sont souvent des données provenant de la base et pareil pour les inputFilters.
J'ai pris la mauvaise habitude dans zend2 de faire des getServiceLocator dans les controllers et forms alors je reprends un peu tout les concepts d'injection de dépendances que j'utilisais que très peu.
C'est pas vraiment un sujet urgent donc je sais pas trop quand je m'y mettrais mais je ne manquerais pas de venir si je suis en galère !
Hors ligne