Magento 2:插件与观察者


27

在Magento 2中,使用插件与观察者来实现目标的利弊是什么?

我知道观察者订阅了事件,而插件可以在Magento类上调用公共方法之前和/或之后跳入,但是可以肯定的是,它们现在已经非常接近交叉路径了吗?


观察者将非常有限,但是插件需要您对所有公共功能进行更改
Pradeep Kumar 2015年

Answers:


42

插件无处不在,因为可以修改/替换系统中任何公共方法的行为。如有可能,应使用带有@api注释的公共方法/类的插件(稳定的公共API)进行自定义。这种方法保证了自定义将在新的Magento版本发布后保持功能。除了问题中提到的before/ after插件之外,还可以创建around插件来替代原始行为。

另一方面,观察者是继承自Magento 1的旧式扩展机制,它非常有限,应尽可能避免。但是,与插件不同,它们可以在受保护/私有方法内提供扩展点。


还可以看看有关偏好vs插件/观察者的答案:magento.stackexchange.com/a/94035/697可能有用。
Alex Paliarush

@alex:-如何为受保护的函数编写插件,大多数情况下我们需要在这种情况下重写受保护的函数怎么办?magento.stackexchange.com/questions/91353/…–
Pradeep Kumar

@PradeepKumar插件只能添加到公共方法中。您提到的问题有一个答案,但是建议的解决方案已被阻止但已知的问题(插件无法应用于虚拟类型)。作为临时的解决方法,您可以为框架URL类声明插件,然后在其中添加基于参数的条件逻辑(这样,该插件仅在您的情况下
起作用

我举一个例子,在这种情况下,受保护的函数很多,如何覆盖,无论如何我都可以覆盖受保护的函数
Pradeep Kumar 2015年

@PradeepKumar如果需要重写受保护的方法,则可能需要扩展类并使用首选项/重写。无论如何,建议您问一个问题而不是在这些评论中
Robbie Averill

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事件的观察者。成功下订单后,将触发您的观察者。
横向

那是否意味着在那种情况下“他们不修改数据”是不正确的?
Robbie Averill

1
是的,您是正确的@RobbieAverill插件和观察者都可以修改数据。对我而言,插件和观察者之间的主要区别是:1.插件只能修改公共方法,而观察者也可以修改私有的,受保护的方法。2.插件有排序顺序,但观察者没有排序顺序。3.您只能将观察者添加到Magento中已调度的事件中。插件在这里更加灵活。
横突
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.