重写Magento 2类与插件


17

Magento 2具有与Magento 1相对的插件/拦截/拦截器的概念。
对于每种公共方法,它们的作用就像事件发生之前或之后。很好
您也可以使用around插件来替换方法的功能。
但是Magento 2仍然提供了或多或少以M1方式重写类的可能性。
我想看到一些重写类而不是使用插件的例子。
我知道这在您要更改核心保护方法的行为时很有用,但是在其他情况下是否建议或需要重写?


Answers:


19

使用重写而不是插件的明显原因是当您需要覆盖私有,受保护或最终方法时

但还要考虑以下情形。

第一种情况(绝对排序顺序):

当您需要在插件之前运行代码时,重写会很有用。我知道您可以通过设置插件来做到这一点sortOrder,但是当有人(不是您)要安装第三方组件时,您不能确定代码始终是第一个。

第二种情况(不包括代码):

如果您只需要排除或重写方法中的一段代码,则插件可能不是最佳选择。我知道您可以使用around插件,避免调用proceed,但这可能会破坏堆栈中的其他插件。

第三种情况(代码样式):

当您需要重写行为时,应该使用重写,插件应该用于修改输出或在之前/之后运行代码。

插件应始终运行原始代码,以避免破坏其他模块。

我的结论是:

如果您可以将一种核心方法视为一个带有一个输入和一个输出的黑匣子,并且对它的内部机制不了解,那么插件可能是最好的选择。

如果您需要更改内部行为,则重写可能是最好的选择。


第一种情况有点不准确(我认为这只是措辞),因为before或arround插件在实际方法代码之前运行(或可以运行)。
David Verholen '16

是的,我的措辞不正确。我的意思是关于实际方法的相对排序顺序。
Phoenix128_RiccardoT

7

很好的问题,前几天我问过自己同样的事情,这是我想到的:

  • 首先,插件不能用于最终方法,最终类以及在没有依赖注入的情况下创建的类,我认为这是一个非常特殊的情况,但是那是您不能使用插件的情况
  • 其次,您需要牢记插件的定义。它用于方法级别,而首选项用于整个类级别。每个人都不是显而易见的,因此记住这一点是很好的。
  • 最后,我认为这是最重要的,似乎插件只能用于扩展Magento类中任何公共方法的行为。因此,似乎您不能使用具有保护/私有方法的插件

资料来源:Magento U基础课程


2
好。很好的理由。我不知道该说第二点。如果要从同一个类中插入许多公共方法,我认为最安全的方法是创建一个充当所有类的插件的类。(我的想法)。我将在2-3天之内保留此空缺,以查看是否有人提出其他原因。如果不是...。复选标记是您的。
马里乌斯

@马里乌斯,你是绝对正确的回复:第二点。由于某些原因,我认为您必须为要插入的每种方法都创建多个插件文件,但是我认为这是观察者要做的,而不是插件。如果更多的人回覆看看是否还有更多原因(不明显),那将是很酷的。
拉斐尔(Raphael)在Digital Pianism上2016年

1
@marius作为补充:因为插件应该是特定于域的,所以我认为,如果它们是同一功能的实现,则至少应该在一个类中定义多个插件至少是最佳实践。通过重写,您将没有此选项,因为您总是更改整个类。因此,我认为这至少是避免重写的原因之一
David Verholen '16

@DavidVerholen。我完全同意。但是我在问使用重写而不是插件的原因。
Marius

是的,我认为这可能是使用插件的原因,因为您可以定义特定于功能的插件类,而重写只能进行一次
David Verholen '16
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.