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/…
Прадип Кумар

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

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

@PradeepKumar Если вам нужно переопределить защищенный метод, вам может потребоваться расширить класс и использовать предпочтения / переписывание. Во всяком случае, предлагаю вам задать вопрос для этого, а не в этих комментариях
Робби Аверилл

1

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

Для меня главное различие между плагинами и наблюдателями:

  1. Плагины могут изменять только общедоступные методы, в то время как наблюдатели могут изменять и закрытые, защищенные.
  2. Существует порядок сортировки для плагинов, но нет порядка сортировки для наблюдателей.
  3. Вы можете добавить наблюдателя только к событиям, которые уже отправлены в Magento. Плагины здесь более гибкие.

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

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

Означает ли это, что «они не изменяют данные» в этом случае неверно?
Робби Аверилл

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