Answers:
使用重写而不是插件的明显原因是当您需要覆盖私有,受保护或最终方法时。
但还要考虑以下情形。
第一种情况(绝对排序顺序):
当您需要在插件之前运行代码时,重写会很有用。我知道您可以通过设置插件来做到这一点sortOrder
,但是当有人(不是您)要安装第三方组件时,您不能确定代码始终是第一个。
第二种情况(不包括代码):
如果您只需要排除或重写方法中的一段代码,则插件可能不是最佳选择。我知道您可以使用around
插件,避免调用proceed
,但这可能会破坏堆栈中的其他插件。
第三种情况(代码样式):
当您需要重写行为时,应该使用重写,插件应该用于修改输出或在之前/之后运行代码。
插件应始终运行原始代码,以避免破坏其他模块。
我的结论是:
如果您可以将一种核心方法视为一个带有一个输入和一个输出的黑匣子,并且对它的内部机制不了解,那么插件可能是最好的选择。
如果您需要更改内部行为,则重写可能是最好的选择。
很好的问题,前几天我问过自己同样的事情,这是我想到的:
资料来源:Magento U基础课程