Réutilisation de formulaires à plusieurs endroits
Dans Nette, vous avez plusieurs options pour réutiliser le même formulaire à plusieurs endroits sans dupliquer le code. Dans cet article, nous allons passer en revue les différentes solutions, y compris celles que vous devriez éviter.
Form Factory
Une approche de base pour utiliser le même composant à plusieurs endroits consiste à créer une méthode ou une classe qui génère le composant, puis à appeler cette méthode à différents endroits de l'application. Une telle méthode ou classe est appelée factory. Ne pas confondre avec le modèle de conception méthode usine, qui décrit une manière spécifique d'utiliser les usines et n'est pas lié à ce sujet.
A titre d'exemple, créons une fabrique qui construira un formulaire d'édition :
Vous pouvez maintenant utiliser cette fabrique à différents endroits de votre application, par exemple dans des présentateurs ou des composants. Pour ce faire, nous la demandons en tant que dépendance. Tout d'abord, nous allons écrire la classe dans le fichier de configuration :
Puis nous l'utilisons dans le présentateur :
Vous pouvez étendre la fabrique de formulaires avec des méthodes supplémentaires pour créer d'autres types de formulaires adaptés à votre application. Et, bien sûr, vous pouvez ajouter une méthode qui crée un formulaire de base sans éléments, que les autres méthodes utiliseront :
La méthode createForm()
ne fait rien d'utile pour l'instant, mais cela changera rapidement.
Dépendances de l'usine
Avec le temps, il deviendra évident que nous avons besoin de formulaires multilingues. Cela signifie que nous devons mettre en
place un traducteur pour tous les formulaires. Pour ce faire,
nous modifions la classe FormFactory
afin qu'elle accepte l'objet Translator
en tant que dépendance
dans le constructeur et qu'elle le transmette au formulaire :
Comme la méthode createForm()
est également appelée par d'autres méthodes qui créent des formulaires
spécifiques, nous n'avons besoin de définir le traducteur que dans cette méthode. Et le tour est joué. Il n'est pas
nécessaire de modifier le code du présentateur ou du composant, ce qui est très bien.
Autres classes d'usine
Vous pouvez également créer plusieurs classes pour chaque formulaire que vous souhaitez utiliser dans votre application.
Cette approche peut améliorer la lisibilité du code et faciliter la gestion des formulaires. Laissez la classe originale
FormFactory
pour créer un formulaire pur avec une configuration de base (par exemple, avec un support de traduction)
et créez une nouvelle classe d'usine EditFormFactory
pour le formulaire d'édition.
Il est très important que la liaison entre les classes FormFactory
et EditFormFactory
soit mise en
œuvre par composition et non
par héritage d'objets:
L'utilisation de l'héritage dans ce cas serait totalement contre-productive. Vous rencontreriez des problèmes très
rapidement. Par exemple, si vous vouliez ajouter des paramètres à la méthode create()
, PHP signalerait une erreur
parce que sa signature est différente de celle du parent. Ou lorsque vous passez une dépendance à la classe
EditFormFactory
via le constructeur. Cela provoquerait ce que nous appelons l'enfer du constructeur.
Il est généralement préférable de préférer la composition à l'héritage.
Traitement des formulaires
Le gestionnaire de formulaire qui est appelé après une soumission réussie peut également faire partie d'une classe d'usine.
Il transmet les données soumises au modèle pour traitement. Il renvoie les erreurs éventuelles au formulaire. Dans l'exemple suivant, le modèle est
représenté par la classe Facade
:
Laissez le présentateur gérer lui-même la redirection. Il ajoutera un autre gestionnaire à l'événement
onSuccess
, qui effectuera la redirection. Le formulaire pourra ainsi être utilisé par différents présentateurs et
chacun d'entre eux pourra rediriger vers un emplacement différent.
Cette solution tire parti de la propriété des formulaires selon laquelle, lorsque addError()
est appelé sur un
formulaire ou son élément, le gestionnaire onSuccess
suivant n'est pas invoqué.
Héritage de la classe de formulaire
Un formulaire construit n'est pas censé être un enfant d'un formulaire. En d'autres termes, n'utilisez pas cette solution :
Au lieu de construire le formulaire dans le constructeur, utilisez la fabrique.
Il est important de comprendre que la classe Form
est avant tout un outil permettant d'assembler un formulaire,
c'est-à-dire un constructeur de formulaire. Le formulaire assemblé peut être considéré comme son produit. Cependant, le
produit n'est pas un cas spécifique du constructeur ; il n'y a pas de relation is a entre eux, ce qui constitue la base
de l'héritage.
Composant de formulaire
Une approche complètement différente consiste à créer un composant qui inclut un formulaire. Cela offre de nouvelles possibilités, par exemple pour rendre le formulaire d'une manière spécifique, puisque le composant inclut un modèle. Des signaux peuvent également être utilisés pour la communication AJAX et le chargement d'informations dans le formulaire, par exemple pour des indications, etc.
Créons une fabrique qui produira ce composant. Il suffit d'écrire son interface:
et de l'ajouter au fichier de configuration :
Nous pouvons maintenant demander la fabrique et l'utiliser dans le présentateur :