Magento2: Was ist der grundlegende Unterschied zwischen Plugin und Vorlieben?

47

Ich habe sowohl Plugin als auch Preference im Magento2-Tutorial verwendet und beide funktionieren einwandfrei, aber was ist der grundlegende Unterschied zwischen ihnen?

Code für das Plugin:

1.1) Fügen Sie eine Plugin-Deklaration in di.xml hinzu:

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

1.2) Erstelle eine Plugin Klasse:

<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}

Code für Präferenz:

2.1) Erstellen Sie eine Präferenzerklärung:

<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />

2.2) Legen Sie eine neue Produktklasse an:

<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}
Yogesh Karodiya
quelle

Antworten:

59

Eine Präferenz entspricht dem Umschreiben von Klassen aus Magento 1. Es entspricht dem Sprichwort: "Wenn der Code danach fragt ClassA, geben Sie sie MyClassBstattdessen." MyClassBEs wird erwartet, dass es sich um eine vollständige Implementierung von handelt ClassA, plus dem Verhalten, das Sie oben hinzufügen oder ändern.

Wie in Magento 1 kann nur eine Voreinstellung (Neuschreiben) für eine Klasse gleichzeitig aktiv sein, es sei denn, Sie verketten sie manuell (so, dass sie MyClassBerweitert OtherClassBund OtherClassBerweitert werden ClassA).

Mit einem Plugin können Sie Code vor, um oder nach Methoden der Klasse ausführen, an die Sie sich anschließen. Ihre Plugin-Klasse ersetzt nicht die Zielklasse und ist keine Instanz davon. Sie müssen nur Methoden before{method}, around{method}, after{method}die zu gegebener Zeit in Bezug auf {Methode} auf der Zielklasse ausgeführt werden soll .

Da Plugins die Zielklasse nicht ersetzen, können beliebig viele Plugins gleichzeitig in einer Klasse aktiv sein. Magento führt sie einfach nacheinander basierend auf dem sortOrder-Parameter in Ihrem XML aus.

Aus diesem Grund sind Plugins viel flexibler als Einstellungen. Sie sollten nach Möglichkeit Plugins verwenden und Einstellungen zum Umschreiben von Klassen vermeiden, sofern dies nicht unbedingt erforderlich ist.

Weitere Informationen zur Funktionsweise und Verwendung von Plugins finden Sie in der offiziellen Dokumentation .

Ryan Hoerr
quelle
Präferenz ist nicht gleichbedeutend mit Klassenumschreibung. Es ist eine Möglichkeit, eine Standardimplementierung für Schnittstellen bereitzustellen.
KAndy
1
@KAndy Das mag der grundlegende Verwendungszweck sein, aber ein Nebeneffekt davon ist, dass sie auch für das Überschreiben von Klassen funktionieren. Semantisch sind sie gleich. Das Umschreiben von Klassen anhand von Präferenzen ist das, wonach Yogesh gefragt hat, und auch, wozu Sie die Grundübungen anweisen, an denen er gearbeitet hat.
Ryan Hoerr
12

In einfachen Worten

Präferenz wird zum Überschreiben der Klasse verwendet

Das Plugin wird zum Hinzufügen von Funktionen vor, nach und um Methoden verwendet.

Für als Ihr Beispiel:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

Wann immer der Code nach ListProduct fragt, sagt dies die Präferenz

Hey, benutze Vendor\MyModule\Block\Product\ListProduct statt Magento\Catalog\Block\Product\ListProduct

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

Wann immer Code nach getPrice () fragt, sagt das Plugin das

Hey, wende meine getPrice() Methode vor, nach und um deine getPrice() Methode an

Prinz Patel
quelle
1

In Kürze :

Mit Preference wird die Standardimplementierung einer Schnittstelle angegeben.

Plugin (Interceptor) wird verwendet, um das Verhalten einer öffentlichen Methode einer anderen Klasse zu erweitern.

Im Detail :

Voreinstellung: Wenn es mehr als eine Klasse gibt, die eine Schnittstelle implementiert, ist es wichtig, die Standardklasse aller implementierten Klassen anzugeben. Dies erfolgt über den Einstellungsknoten in der Abhängigkeitsinjektionsdatei (di.xml).

Beispiel

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

Diese Zuordnung ist in app/etc/di.xml, sodass der Objektmanager die Magento\Core\Model\UrlImplementierungsklasse immer dann einfügt , wenn eine Anforderung für Magento\Core\Model\UrlInterfaceden globalen Bereich vorliegt.

Plugin (Interceptor):

Angenommen, eine Klasse Ahat eine Methode, methodAdie eine erweiterte Funktionalität benötigt. Dies wird dann durch Plugins erreicht, indem eine Klasse erstellt wird, APluginohne die ursprüngliche Klasse zu ändern A. Class APluginverfügt über Methoden, die vor, nach oder um die erforderliche Methode ausgeführt werden.

Beispiel

<config>
    <type name="Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock">
        <plugin name="showOutOfStockValueChanged" type="Magento\Catalog\Model\Plugin\ShowOutOfStockConfig"/>
    </type>
</config>

Diese Zuordnung befindet sich in app / etc / di.xml. Eine / Wenige der Klassenmethoden Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockwerden vor / nach / um die Klassenmethoden ausgeführt Magento\Catalog\Model\Plugin\ShowOutOfStockConfig.

Nikin
quelle