Magento2: в чому полягає основна відмінність плагіна від уподобань?


47

Я використовував як плагін, так і переваги в навчальному посібнику 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) Створіть новий клас продуктів:

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

Відповіді:


59

Вподобання еквівалентно переписуванню класу з Magento 1. Це еквівалентно твердженню: "Коли код вимагає ClassA, дайте їм MyClassBзамість цього". MyClassBочікується, що це буде повною реалізацією ClassAплюс будь-яку поведінку, яку ви додаєте чи змінюєте зверху.

Як і в Magento 1, лише один параметр (переписувати) може бути активним для класу одночасно, якщо ви не вручаєте їх вручну (наприклад, що MyClassBрозширюється OtherClassBта OtherClassBрозширюється ClassA).

Плагін дозволяє виконувати код до, навколо або після методів з класу, на який ви підключаєтесь. Ваш клас плагінів не замінює цільовий клас, і він не є його примірником. Ви просто методи before{method}, around{method}, after{method}які отримують виконані у відповідний час щодо {методу} на цільовому класі.

Оскільки плагіни не замінюють цільовий клас, будь-яка кількість плагінів може бути активною для класу одночасно. Magento просто виконує їх один за одним на основі параметра sortOrder у вашому XML.

Через це плагіни набагато гнучкіші за налаштування. Ви повинні використовувати плагіни, коли це можливо, і уникати переваг для переписування класів, якщо це абсолютно не потрібно.

Детальніше про те, як працюють плагіни та як їх використовувати, ви можете прочитати в офіційній документації .


Перевага не еквівалентно переписуванню класів. Це спосіб забезпечити реалізацію за замовчуванням для інтерфейсів.
Кенді

1
@KAndy Це може бути основною ціллю, але побічним ефектом цього є те, що вони також працюють для переосмислення класу. Семантично вони однакові. Переписування класів за допомогою уподобань - це те, про що Йогеш розпитував, а також те, що навчає Основи, над якими він навчається.
Ryan Hoerr

12

Простими словами

Перевага використовується для переосмислення класу

Плагін використовується для додавання функціональності до, після та навколо методів.

Для вашого прикладу:

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

Щоразу, коли код запитує список ListProduct, переваги говорять про це

Гей, використовуй Vendor\MyModule\Block\Product\ListProduct замість 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>

Щоразу, коли код запитує getPrice (), плагін це сказав

Ей, використовуйте мій getPrice() метод до, після та навколо вашого getPrice() методу


1

Коротко :

Налаштування використовується для визначення інтерфейсу реалізації за замовчуванням.

Плагін (Interceptor) використовується для розширення поведінки публічного методу іншого класу.

Детально :

Перевагу: Якщо існує більше одного класу, який реалізує інтерфейс, важливо вказати типовий один із усіх реалізованих класів. Це робиться через вузол уподобань у файлі ін'єкції залежності (di.xml).

Приклад:

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

Це відображення є app/etc/di.xml, тому менеджер об'єктів вводить Magento\Core\Model\Urlклас реалізації там, де є запит для Magento\Core\Model\UrlInterfaceглобальної області.

Плагін (перехоплювач):

Скажімо, у класі Aє метод, methodAякий потребує розширеної функціональності. Потім це досягається за допомогою плагінів шляхом створення класу APluginбез зміни початкового класу A. Клас APluginмає методи, які виконуються до, після або навколо необхідного методу.

Приклад:

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

Це відображення в програмі / etc / di.xml. Один / мало хто з Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockметодів класів виконується до / після / навколо Magento\Catalog\Model\Plugin\ShowOutOfStockConfigметодів класу .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.