Umschreiben von Magento 2 Klassen gegen Plugins

17

Magento 2 hat das Konzept von Plugins / Interception / Interceptors im Gegensatz zu Magento 1.
Diese wirken wie ein Vorher-Nachher-Ereignis für jede öffentliche Methode. Was nett ist.
Sie können das aroundPlugin auch verwenden , um die Funktionalität einer Methode zu ersetzen.
Magento 2 bietet jedoch weiterhin die Möglichkeit, Klassen mehr oder weniger auf M1-Basis umzuschreiben.
Ich würde gerne einige Beispiele sehen, in denen das Umschreiben von Klassen der richtige Weg ist, anstatt Plugins zu verwenden.
Ich weiß, dass dies nützlich ist, wenn Sie das Verhalten einer geschützten Kernmethode ändern möchten, aber gibt es andere Fälle, in denen ein Umschreiben empfohlen oder erforderlich ist?

Marius
quelle

Antworten:

19

Der offensichtliche Grund, ein Umschreiben anstelle eines Plugins zu verwenden, ist, wenn Sie eine private, geschützte oder endgültige Methode überschreiben müssen .

Beachten Sie aber auch die folgenden Szenarien.

1. Szenario (absolute Sortierreihenfolge):

Rewrites können nützlich sein, wenn Sie Ihren Code vor Plugins ausführen müssen . Ich weiß, dass Sie dies tun können, indem Sie das Plugin einstellen sortOrder, aber Sie können nicht sicher sein, dass Ihr Code immer der erste ist, wenn jemand (nicht Sie) Komponenten von Drittanbietern installiert.

2. Szenario (Code ausschließen):

Wenn Sie nur einen Teil des Codes in einer Methode ausschließen oder neu schreiben müssen , ist ein Plugin möglicherweise nicht optimal. Ich weiß, Sie können ein aroundPlugin verwenden und den Aufruf des vermeiden proceed, aber dies könnte andere Plugins im Stack beschädigen.

3. Szenario (Codestil):

Sie sollten Schreibungen verwenden , wenn Sie benötigen zu umschreiben ein Verhalten, Plugins sollte verwendet werden , die Ausgabe zu modifizieren oder Ausführen von Code vor / nach.

Ein Plugin sollte immer den Originalcode ausführen , um zu vermeiden, dass andere Module beschädigt werden.

Meine Schlussfolgerung:

Wenn Sie eine Kernmethode als Black Box mit einer Eingabe und einer Ausgabe betrachten und sich nicht mit den internen Mechanismen auskennen, ist ein Plug-in die beste Option.

Wenn Sie ein internes Verhalten ändern müssen , ist ein Umschreiben möglicherweise die beste Option.

Phoenix128_RiccardoT
quelle
Das erste Szenario ist etwas ungenau (ich denke, es ist nur der Wortlaut), da ein Vorher- oder Nachher-Plugin vor dem eigentlichen Methodencode ausgeführt wird (oder ausgeführt werden kann).
David Verholen
Ja, mein Wortlaut war nicht korrekt. Mein Punkt war die relative Sortierreihenfolge mit der tatsächlichen Methode.
Phoenix128_RiccardoT
7

Tolle Frage, ich habe mir neulich das Gleiche gefragt und habe mir Folgendes ausgedacht:

  • Erstens können Plugins nicht für endgültige Methoden, endgültige Klassen und Klassen verwendet werden, die ohne Abhängigkeitsinjektion erstellt wurden. Ich denke, das ist ein sehr spezieller Fall, aber das ist ein Fall, in dem Sie keine Plugins verwenden können
  • Zweitens müssen Sie die Definition eines Plugins berücksichtigen. Es wird verwendet, um auf einer Methodenebene zu arbeiten, während Präferenzen verwendet werden, um auf der gesamten Klassenebene zu arbeiten. Es ist nicht jedermanns Sache, also ist es gut, das im Hinterkopf zu behalten.
  • Und schließlich, und ich denke, das ist das Wichtigste, scheint es, dass Plugins nur verwendet werden können, um das Verhalten einer öffentlichen Methode innerhalb einer Magento-Klasse zu erweitern . Aus diesem Grund können Plugins anscheinend nicht mit geschützten / privaten Methoden verwendet werden .

Quelle: Magento U Grundkurs

Raphael bei Digital Pianism
quelle
2
In Ordnung. Gute Gründe. Ich weiß jedoch nicht, was ich zum zweiten Punkt sagen soll. Wenn Sie viele öffentliche Methoden aus derselben Klasse einbinden möchten, ist es meiner Meinung nach am sichersten, eine einzelne Klasse zu erstellen, die als Plug-in für alle Klassen fungiert. (meine Meinung). Ich lasse dies 2-3 Tage offen, um zu sehen, ob jemand andere Gründe vorbringt. Wenn nicht ... ist das Häkchen bei Ihnen.
Marius
@Marius du hast absolut recht was den zweiten Punkt betrifft. Aus einigen Gründen dachte ich, Sie müssten für jede Methode, die Sie pluginisieren möchten, mehrere Plugin-Dateien erstellen, aber ich denke, das tun Beobachter, nicht Plugins. Das wäre cool, wenn mehr Leute antworten, um zu sehen, ob es mehr Gründe gibt (nicht offensichtlich).
Raphael bei Digital Pianism
1
@marius als Ergänzung: Da Plugins domänenspezifisch sein sollten, sollte es meiner Meinung nach zumindest eine bewährte Methode sein, nur mehrere Plugins in einer Klasse zu definieren, wenn sie eine Implementierung derselben Funktion darstellen. Bei einem Umschreiben haben Sie diese Option nicht, da Sie immer eine ganze Klasse ändern. Ich denke, das wäre ein Grund, zumindest zu versuchen, Überschreibungen zu vermeiden
David Verholen
@DavidVerholen. Ich bin völlig einverstanden. Aber ich habe nach Gründen gefragt, um Rewrites anstelle von Plugins zu verwenden.
Marius
Ja, ich denke, dies könnte ein Grund für die Verwendung von Plugins sein, da Sie funktionsspezifische Plugin-Klassen definieren können, während ein Umschreiben nur einmal durchgeführt werden kann
David Verholen,