Magento 2: Plugin vs Observer

27

Dans Magento 2, quels sont les avantages et les inconvénients de l'utilisation d'un plugin par rapport à un observateur pour réaliser quelque chose?

Je comprends que les observateurs sont abonnés aux événements alors que les plugins peuvent intervenir avant et / ou après qu'une méthode publique soit appelée sur une classe Magento, mais ils sont sûrement très proches de se croiser maintenant?

Robbie Averill
la source
observateur sera très limité mais en plugin vous faites les changements pour toute fonction publique
Pradeep Kumar

Réponses:

42

Les plugins sont omniprésents car il est possible de modifier / remplacer le comportement de n'importe quelle méthode publique du système. Les personnalisations doivent être effectuées à l'aide de plugins pour les méthodes / classes publiques marquées d' @apiannotations (API publique stable) dans la mesure du possible. Une telle approche garantit que la personnalisation restera fonctionnelle après les nouvelles versions de Magento. En plus des before/ afterplugins mentionnés dans la question, il est possible de créer des aroundplugins pour remplacer le comportement d'origine.

D'autre part, les observateurs sont un mécanisme d'extension hérité hérité de Magento 1, il est assez limité et devrait être évité si possible. Cependant, contrairement aux plugins, ils peuvent fournir des points d'extension à l'intérieur des méthodes protégées / privées.

Alex Paliarush
la source
Jetez également un œil à la réponse parlant des préférences par rapport aux plugins / observateurs: magento.stackexchange.com/a/94035/697 , peut être utile.
Alex Paliarush
@alex: - comment écrire un plugin pour une fonction protégée, dans la plupart des cas, nous devons remplacer la fonction protégée dans cette situation, comment le faire? magento.stackexchange.com/questions/91353/…
Pradeep Kumar
Les plugins @PradeepKumar peuvent être ajoutés aux méthodes publiques uniquement. La question que vous avez mentionnée a une réponse, mais la solution proposée est bloquée mais problème connu (les plugins ne peuvent pas être appliqués aux types virtuels). Comme solution de contournement temporaire, vous pouvez déclarer le plugin pour la classe d'URL du framework et y ajouter une logique conditionnelle basée sur des arguments (afin que le plugin fasse quelque chose uniquement pour votre cas)
Alex Paliarush
i jut a donné un exemple, il y a beaucoup de fonctions dans protected dans ce cas comment passer outre, de toute façon je suis là pour passer outre la fonction protégée
Pradeep Kumar
@PradeepKumar si vous devez remplacer une méthode protégée, vous devrez peut-être étendre la classe et utiliser la préférence / réécriture. Quoi qu'il en soit, je vous suggère de poser une question à ce sujet au lieu de dans ces commentaires
Robbie Averill
1

Selon le guide technique de Magento ( https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events ): toutes les valeurs (y compris les objets) passées à un événement NE DOIVENT PAS être modifié dans l'observateur de l'événement. Au lieu de cela, les plugins DEVRAIENT ÊTRE utilisés pour modifier l'entrée ou la sortie d'une fonction.

Pour moi, la principale différence entre les plugins et les observateurs est:

  1. Les plugins ne peuvent modifier que les méthodes publiques tandis que les observateurs peuvent également modifier les méthodes privées, protégées.
  2. Il y a un ordre de tri pour les plugins mais il n'y a pas d'ordre de tri pour les observateurs.
  3. Vous pouvez ajouter un observateur uniquement aux événements déjà distribués dans Magento. Les plugins sont plus flexibles ici.
transversus
la source
Je peux également mettre à jour une commande avec un observateur, non?
Robbie Averill
@RobbieAverill oui, vous pouvez créer un observateur pour l' checkout_submit_all_afterévénement. Votre observateur sera déclenché une fois la commande passée avec succès.
transversus
Est-ce à dire que «ils ne modifient pas les données» n'est pas vrai dans ce cas?
Robbie Averill
1
Oui, vous avez raison @RobbieAverill Les plugins et les observateurs peuvent tous deux modifier les données. Pour moi, la principale différence entre les plugins et les observateurs est: 1. Les plugins ne peuvent modifier que les méthodes publiques tandis que les observateurs peuvent également modifier les méthodes privées, protégées. 2. Il y a un ordre de tri pour les plugins mais il n'y a pas d'ordre de tri pour les observateurs. 3. Vous pouvez ajouter un observateur uniquement aux événements déjà envoyés dans Magento. Les plugins sont plus flexibles ici.
transversus