Magento 2: Welcher Erweiterungsmechanismus soll gewählt werden?

9

Wir können den Controller auf zwei Arten erweitern: mit Präferenz und mit Plugin. Aber ich verstehe das nicht, welches gut ist und welche Vor- / Nachteile die Präferenz gegenüber dem Plugin hat.

<preference for="Magento\Checkout\Controller\Index\Index" type="mymodule\Helloworld\Controller\Index\Index" />

<type name="Magento\Catalog\Model\Product">
    <plugin name="getname-test-module" type="mymodule\Helloworld\Model\Plugin\Product" sortOrder="10"/>
</type>
Anand Ontigeri
quelle
Mögliches Duplikat von Magento 2: Plugin vs Observer
7ochem

Antworten:

11

Verwenden Sie nach Möglichkeit Plugins und dann Beobachter (siehe Vor- und Nachteile der einzelnen Plugins ). Auf diese Weise können Sie Konflikte mit anderen Erweiterungen (Modulen von Drittanbietern) vermeiden.

Die Einstellung sollte nur verwendet werden, wenn die gesamte Implementierung der Kernklasse / Schnittstelle durch eine benutzerdefinierte ersetzt werden soll. Berücksichtigen Sie, dass jeweils nur eine Voreinstellung aktiv ist (welche durch die in definierte Reihenfolge definiert ist module.xml). Wenn also eine andere Erweiterung die Präferenz für dieselbe Klasse / Schnittstelle definiert, liegt ein Konflikt vor (diese Erweiterungen können nicht zusammenarbeiten).

Alex Paliarush
quelle
4
  • Wenn Ihre Funktionalität die Kernfunktionalität vollständig ersetzt, können Sie Einstellungen verwenden.
  • Wenn Sie die Funktionalität zur Basis hinzufügen oder eine Klassenmethode teilweise ersetzen möchten, verwenden Sie bitte Plugins.
KAndy
quelle
1
Es erscheint ratsam zu bemerken, dass Sie, wenn Sie die Kernfunktionalität ersetzen, die Kernaktualisierungen überwachen und sicherstellen müssen, dass Ihre benutzerdefinierten Module auf dem neuesten Stand sind
Robbie Averill,
1

Zusätzliche Informationen: Fast alle Einstellungen, die in intern m2 verwendet werden, dienen nur dazu, die Beziehung zwischen der Basisbetonklasse und der Schnittstelle aufrechtzuerhalten, wie z.

<preference for="Magento\Store\Model\StoreManagerInterface" type="Magento\Store\Model\StoreManager" />

Wie Sie sagen, es wird einmal verwendet, denke ich:

<preference for="Magento\ImportExport\Controller\Adminhtml\Export\GetFilter" type="Magento\AdvancedPricingImportExport\Controller\Adminhtml\Export\GetFilter" />
Ibnab
quelle