Magento 2: Plugin gegen Observer


27

Was sind in Magento 2 die Vor- und Nachteile der Verwendung eines Plugins gegenüber einem Beobachter, um etwas zu erreichen?

Ich verstehe, dass Beobachter Ereignisse abonniert haben, während Plugins vor und / oder nach dem Aufruf einer öffentlichen Methode für eine Magento-Klasse einspringen können.


Beobachter wird sehr begrenzt, aber Plugin Sie die Änderungen für alle öffentlichen Funktionen
Pradeep Kumar

Antworten:


42

Plugins sind allgegenwärtig, da das Verhalten jeder öffentlichen Methode im System geändert / ersetzt werden kann. Anpassungen sollten nach Möglichkeit mit Plugins für öffentliche Methoden / Klassen vorgenommen werden, die mit @apiAnnotation (stabile öffentliche API) gekennzeichnet sind. Ein solcher Ansatz garantiert, dass die Anpassung nach neuen Magento-Versionen weiterhin funktioniert. Zusätzlich zu before/ afterplugins, die in der Frage erwähnt wurden, ist es möglich, aroundPlugins zu erstellen, um das ursprüngliche Verhalten zu ersetzen.

Andererseits sind Beobachter Legacy-Erweiterungsmechanismen, die von Magento 1 geerbt wurden. Sie sind ziemlich begrenzt und sollten nach Möglichkeit vermieden werden. Im Gegensatz zu Plugins können sie jedoch Erweiterungspunkte in geschützten / privaten Methoden bereitstellen.


Schauen Sie sich auch die Antwort an, in der es um Einstellungen gegenüber Plugins / Beobachtern geht: magento.stackexchange.com/a/94035/697 , kann hilfreich sein.
Alex Paliarush

@alex: - Wie schreibe ich ein Plugin für eine geschützte Funktion? In den meisten Fällen müssen wir eine geschützte Funktion in dieser Situation überschreiben. Wie mache ich das? magento.stackexchange.com/questions/91353/…
Pradeep Kumar

@PradeepKumar-Plugins können nur zu öffentlichen Methoden hinzugefügt werden. Die von Ihnen erwähnte Frage hat eine Antwort, aber die vorgeschlagene Lösung ist blockiert, das Problem ist jedoch bekannt (Plugins können nicht auf virtuelle Typen angewendet werden). Als vorübergehende Problemumgehung können Sie das Plugin für die Framework-URL-Klasse deklarieren und dort eine auf Argumenten basierende bedingte Logik hinzufügen (damit das Plugin nur in Ihrem Fall etwas bewirkt)
Alex Paliarush

Ich habe nur ein Beispiel angeführt: In diesem Fall gibt es eine Menge geschützter Funktionen, die außer Kraft gesetzt werden können
Pradeep Kumar,

@PradeepKumar Wenn Sie eine geschützte Methode überschreiben müssen, müssen Sie möglicherweise die Klasse erweitern und Preference / Rewriting verwenden. Wie auch immer, schlagen Sie vor, dass Sie eine Frage dafür stellen, anstatt in diesen Kommentaren
Robbie Averill

1

Laut Magento Technical Guide ( https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events ): Alle Werte (einschließlich Objekte), die an ein Ereignis übergeben werden, DÜRFEN NICHT sein im Ereignisbeobachter geändert. Stattdessen sollten Plugins verwendet werden, um die Eingabe oder Ausgabe einer Funktion zu ändern.

Für mich ist der Hauptunterschied zwischen Plugins und Beobachtern:

  1. Plugins können nur öffentliche Methoden ändern, während Beobachter auch private, geschützte Methoden ändern können.
  2. Es gibt eine Sortierreihenfolge für Plugins, für Beobachter jedoch keine.
  3. Sie können Beobachter nur zu den Ereignissen hinzufügen, die bereits in Magento ausgelöst wurden. Plugins sind hier flexibler.

Ich kann aber auch einen Auftrag mit einem Beobachter aktualisieren, oder?
Robbie Averill

@RobbieAverill Ja, Sie können einen Beobachter für das checkout_submit_all_afterEreignis erstellen . Ihr Beobachter wird nach erfolgreicher Bestellung ausgelöst.
Transversus

Bedeutet das, dass „sie ändern keine Daten“ in diesem Fall nicht zutrifft?
Robbie Averill

1
Ja, Sie sind korrekt @RobbieAverill Sowohl Plugins als auch Beobachter können Daten ändern. Für mich ist der Hauptunterschied zwischen Plugins und Beobachtern: 1. Plugins können nur öffentliche Methoden ändern, während Beobachter auch private, geschützte Methoden ändern können. 2. Es gibt eine Sortierreihenfolge für Plugins, aber keine Sortierreihenfolge für Beobachter. 3. Sie können Beobachter nur zu den Ereignissen hinzufügen, die bereits in Magento ausgelöst wurden. Plugins sind hier flexibler.
Transversus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.