Użyłem zarówno wtyczki, jak i preferencji w tutorialu magento2 i oba działają dobrze, ale jaka jest podstawowa różnica między nimi.
Kod wtyczki:
1.1) Dodaj deklarację wtyczki do di.xml:
<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>
1.2) Utwórz klasę wtyczek:
<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}
Kod preferencji:
2.1) Utwórz deklarację preferencji:
<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />
2.2) Utwórz nową klasę produktu:
<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}
źródło
W prostych słowach
Jako Twój przykład:
Za każdym razem, gdy kod pyta o ListProduct, preferencja tak mówi
Hej, użyj
Vendor\MyModule\Block\Product\ListProduct
zamiastMagento\Catalog\Block\Product\ListProduct
Ilekroć kod pyta o getPrice (), wtyczka tak mówi
Hej, użyj mojej
getPrice()
metody przed, po i wokół twojejgetPrice()
metodyźródło
W skrócie :
Szczegółowo :
Preferencje: Jeśli istnieje więcej niż jedna klasa, która implementuje interfejs, ważne jest, aby określić domyślną jedną ze wszystkich zaimplementowanych klas. Odbywa się to za pośrednictwem węzła preferencji w pliku wstrzykiwania zależności (di.xml).
Przykład:
Odwzorowanie jest włączone
app/etc/di.xml
, więc menedżer obiektów wstrzykujeMagento\Core\Model\Url
klasę implementacji wszędzie tam, gdzie jest żądanieMagento\Core\Model\UrlInterface
w zakresie globalnym.Wtyczka (przechwytywacz):
Powiedzmy, klasa
A
ma metodę,methodA
która wymaga rozszerzonej funkcjonalności. Następnie osiąga się to poprzez wtyczki, tworząc klasęAPlugin
bez modyfikowania oryginalnej klasyA
. KlasaAPlugin
ma metody działające przed, po lub wokół wymaganej metody.Przykład:
To mapowanie znajduje się w app / etc / di.xml. Jedna / Kilka
Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock
metod klasy jest wykonywana przed / po / wokółMagento\Catalog\Model\Plugin\ShowOutOfStockConfig
metod klasy .źródło