Magento 2中哪些类是“可拦截/可插入”的类


17

日期:2015年5月30日(鉴于Magento 2的性质不断变化)。

Magento 2引入了一个插件概念通过拦截器模式实现

从文档中尚不清楚的是-Magento中的哪些类和对象是“可拦截的”?也就是说,您可以使用如下所示的XML配置插件

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

但尚不清楚哪些类可以作为来使用ObservedType。这篇较老的Wiki文章说了一些线索

请注意,插件功能不适用于-在没有依赖项注入的情况下创建的类,即直接使用运算符new创建的类,-Final方法,-Final类

通过依赖项注入创建的任何对象是否可以被拦截?是否ObservedType需要成为a __construct方法中提供的类型提示,或者是否可以(应该吗?)还可以吗?

在我开始使用Magento 2拦截器之前,主要是想弄清楚我能做什么和不能做什么。

Answers:


10

Magento模块的每个类别都是可互换的。

如当前Wiki所述,它受最终方法和类的限制

未通过验证,但是不允许(/应该)拦截类库(lib目录)。

我认为,至少在正确配置自动加载器的情况下,如何创建对象的限制已不再成立。并且不要紧,因为它们不是在运行中创建的,而是在生成器执行时创建的。(仅此而已,magento自动装带器应该是第一个)


2
对于拦截lib类,我们没有任何限制。同样,要使对象可拦截,也必须使用ObjectManager(构造函数注入)来创建它。
安东·克里尔

1
应当指出,魔术方法(但使用phpdoc声明)不能被截获。我认为。Varien_Object样式在某些地方仍然存在。
nevvermind 2015年

11

我们正在研究“ @api”批注,以批注推荐的方法,这些方法在各个发行版之间将更加稳定。如果您担心可升级性,除了可以定义插件之外,还应该考虑应该定义插件的内容。我们不建议拦截非@api方法,但有时我们知道这可能是最好的选择。(我们将其留给开发人员自行决定。)

正式地,您可以拦截不是最终的公共方法。私有方法肯定行不通。从内存中,侦听当前可以通过创建继承真实类的后代类来实现(当您请求真实类的新实例时,依赖项注入框架会创建所生成类的实例)。因此,任何可以创建子类并覆盖原始方法的方法都可能会起作用,但是建议使用公共方法,这使我们可以灵活地在将来使用其他一些聪明的实现(如果没有充分的理由,这将永远不会成为现实) 。


5

我知道这已经有了答案,但这是两年前的事了。也许与此同时有些事情发生了变化。

这是我到目前为止发现的。
官方文档开始,到深入研究拦截过程。

我会反过来回答。
什么CAN NOT在Magento 2.被拦截
从官方文档

  • 引导启动Magento \ Framework \ Interception之前实例化的对象(不确定该点在哪里)
  • 最终方法
  • 最终类中的任何方法(因为生成的拦截器类必须扩展原始类)
  • 任何包含至少一个最终公共方法的类
  • 非公共方法(它可以用于受保护的方法,但这不是“道德的”,因为它将非公共方法暴露给类的外部)
  • 静态方法
  • __构造
  • 虚拟类型

从四处挖掘

  • 未通过对象管理器实例化的类中的方法。(示例\Magento\Framework\Phrase
  • 类实现\Magento\Framework\ObjectManager\NoninterceptableInterface。(例如,\Magento\Framework\App\Cache\Proxy以及所有其他自动生成的代理)
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.