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

有帮助吗?

解决方案

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

但还要考虑以下场景。

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

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

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

如果您需要排除或 只重写一段代码 在某种方法中,插件可能是次优的方式。我知道你可以使用 around 插件并避免调用 proceed, ,但这可能会破坏堆栈中的其他插件。

第三种情况(代码风格):

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

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

我的结论:

如果您可以将核心方法视为 黑盒子 如果有一个输入和一个输出,并且您对其内部机制一无所知,那么插件可能是最好的选择。

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

其他提示

伟大的问题,我前几天问自己同样的事情,这是我想出的:

  • 首先,插件不能用于无依赖注入的最终方法,最终类和类我认为这是一个非常具体的案例,但这就是你不能使用插件的一个情况
  • 第二,您需要牢记插件的定义。它用于处理方法级别,而偏好用于在整个阶级级别工作。对每个人来说都不明显,所以请记住这一点是很好的。
  • 最后,我认为这是最重要的,似乎插件只能用于在magento类中扩展任何公共方法的行为。因此,它似乎是不能使用带有保护/私有方法的插件

资料来源: magento u基本课程

许可以下: CC-BY-SA归因
scroll top