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;
}
}
quelle
In einfachen Worten
Für als Ihr Beispiel:
Wann immer der Code nach ListProduct fragt, sagt dies die Präferenz
Hey, benutze
Vendor\MyModule\Block\Product\ListProduct
stattMagento\Catalog\Block\Product\ListProduct
Wann immer Code nach getPrice () fragt, sagt das Plugin das
Hey, wende meine
getPrice()
Methode vor, nach und um deinegetPrice()
Methode anquelle
In Kürze :
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
Diese Zuordnung ist in
app/etc/di.xml
, sodass der Objektmanager dieMagento\Core\Model\Url
Implementierungsklasse immer dann einfügt , wenn eine Anforderung fürMagento\Core\Model\UrlInterface
den globalen Bereich vorliegt.Plugin (Interceptor):
Angenommen, eine Klasse
A
hat eine Methode,methodA
die eine erweiterte Funktionalität benötigt. Dies wird dann durch Plugins erreicht, indem eine Klasse erstellt wird,APlugin
ohne die ursprüngliche Klasse zu ändernA
. ClassAPlugin
verfügt über Methoden, die vor, nach oder um die erforderliche Methode ausgeführt werden.Beispiel
Diese Zuordnung befindet sich in app / etc / di.xml. Eine / Wenige der Klassenmethoden
Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock
werden vor / nach / um die Klassenmethoden ausgeführtMagento\Catalog\Model\Plugin\ShowOutOfStockConfig
.quelle