Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 13-04-2018 17:24:10

zigo
Membre
Date d'inscription: 24-02-2016
Messages: 26

InputFilter dans le model ou dans le form ?

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 smile

Hors ligne

 

#2 19-04-2018 15:37:12

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: InputFilter dans le model ou dans le form ?

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

Code:

[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)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#3 20-04-2018 10:24:34

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: InputFilter dans le model ou dans le form ?

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

 

#4 24-04-2018 10:03:32

zigo
Membre
Date d'inscription: 24-02-2016
Messages: 26

Re: InputFilter dans le model ou dans le form ?

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages