Я использовал оба плагина и предпочтения в учебнике magento2, и оба работают нормально, но в чем их основное отличие.
Код для плагина:
1.1) Добавьте объявление плагина в di.xml:
<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>
1.2) Создайте класс плагина:
<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}
Код для предпочтения:
2.1) Создайте объявление предпочтений:
<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />
2.2) Создайте новый класс Product:
<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}
источник
Простыми словами
Для вашего примера:
Всякий раз, когда код запрашивает ListProduct, предпочтение говорит, что
Эй, используйте
Vendor\MyModule\Block\Product\ListProduct
вместоMagento\Catalog\Block\Product\ListProduct
Всякий раз, когда код запрашивает getPrice (), плагин говорит, что
Эй, используйте мой
getPrice()
метод до, после и вокруг вашегоgetPrice()
методаисточник
Вкратце :
В деталях :
Предпочтение: если существует более одного класса, реализующего интерфейс, важно указать один из всех реализованных классов по умолчанию. Это делается через узел предпочтений в файле внедрения зависимостей (di.xml).
Пример :
Это отображение включено
app/etc/di.xml
, поэтому диспетчер объектов внедряетMagento\Core\Model\Url
класс реализации везде, где есть запрос дляMagento\Core\Model\UrlInterface
в глобальной области.Плагин (Перехватчик):
Скажем, у класса
A
есть метод,methodA
который требует расширенной функциональности Затем это достигается с помощью плагинов путем создания классаAPlugin
без изменения исходного классаA
. У классаAPlugin
есть методы, которые выполняются до, после или вокруг требуемого метода.Пример :
Это сопоставление находится в приложении / etc / di.xml. Один / несколько методов класса
Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock
выполняются до / после / вокругMagento\Catalog\Model\Plugin\ShowOutOfStockConfig
методов класса .источник