Magento 2: Плагін проти спостерігача


27

У Magento 2, які плюси та мінуси використання плагіна проти спостерігача для досягнення чогось?

Я розумію, що спостерігачі підписуються на події, тоді як плагіни можуть стрибати до та / або після виклику публічного методу класу Magento, але, напевно, вони зараз дуже близькі до перетину шляхів?


спостерігач буде дуже обмежений, але плагін ви зробите зміни для всіх публічних функцій
Pradeep Kumar

Відповіді:


42

Плагіни є всюдисущими, оскільки можна змінити / замінити поведінку будь-якого загальнодоступного методу в системі. Настроювання слід проводити за допомогою плагінів для публічних методів / класів, позначених @apiанотацією (стабільний публічний API), коли це можливо. Такий підхід гарантує, що налаштування залишиться функціональним після нових версій Magento. Окрім before/ afterплагінів, зазначених у питанні, можна створити aroundплагіни для заміни оригінальної поведінки.

З іншого боку, спостерігачі - це спадковий механізм розширення спадщини, успадкований від Magento 1, він досить обмежений і його слід уникати, якщо можливо. Однак, на відміну від плагінів, вони можуть надавати точки розширення всередині захищених / приватних методів.


Ознайомтесь і з відповіддю, що розповідає про переваги та плагіни / спостерігачі: magento.stackexchange.com/a/94035/697 , може бути корисним.
Олексій Паляруш

@alex: - як написати плагін для захищеної функції; в більшості випадків нам потрібно перекрити захищену функцію, як це зробити? magento.stackexchange.com/questions/91353/…
Pradeep Kumar

Плагіни @PradeepKumar можна додавати лише до загальнодоступних методів. На вказане вами питання є відповідь, але пропоноване рішення заблоковано, але відома проблема (плагіни не можна застосовувати до віртуальних типів). Як тимчасове вирішення, ви можете оголосити плагін для класів URL-адреси фрейму і додати до нього умовну логіку, засновану на аргументах (щоб плагін
робив

я привів один приклад, є багато функцій у захищеному в тому випадку, як перекрити, будь-яким способом я перекрити захищену функцію
Pradeep Kumar

@PradeepKumar, якщо вам потрібно змінити захищений метод, можливо, вам доведеться розширити клас і використовувати налаштування / перезапис. Так чи інакше, пропонуємо вам задати питання замість цього коментаря
Роббі Аверилл

1

Відповідно до технічного посібника Magento ( https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events ): усі значення (включаючи об'єкти) передані події, НЕ МОЖЕ бути видозмінений у спостерігача події. Натомість плагіни БУТЬ використовуватися для зміни входу чи виводу функції.

Для мене головна відмінність плагінів від спостерігачів:

  1. Плагіни можуть змінювати лише загальнодоступні методи, тоді як спостерігачі також можуть змінювати приватні, захищені.
  2. Існує порядок сортування плагінів, але немає порядку сортування для спостерігачів.
  3. Ви можете додати спостерігача лише до подій, які вже відправлені в Магенто. Плагіни тут гнучкіші.

Я також можу оновити замовлення у спостерігача, хоча правильно?
Роббі Аверилл

@RobbieAverill так, ви можете створити спостерігача за checkout_submit_all_afterподією. Ваш спостерігач буде запущений після успішного розміщення замовлення.
перехрестя

Чи означає це, що "вони не змінюють дані" не відповідає дійсності в цьому випадку?
Роббі Аверилл

1
Так, ви праві @RobbieAverill Як плагіни, так і спостерігачі можуть змінювати дані. Для мене головна відмінність плагінів від спостерігачів полягає в наступному: 1. Плагіни можуть змінювати лише загальнодоступні методи, тоді як спостерігачі також можуть змінювати приватні, захищені. 2. Існує порядок сортування плагінів, але немає порядку сортування для спостерігачів. 3. Ви можете додати спостерігача лише до подій, які вже відправлені в Магенто. Плагіни тут гнучкіші.
трансверсія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.