日期:五月三十日 (鉴于Magento2的变化性质)。

Magento2介绍 插件概念, ,实施 通过拦截器模式.

从文档中不清楚的是-Magento中的哪些类和对象是"拦截能力"的?也就是说,您使用XML配置一个插件,如下所示

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

但目前尚不清楚哪些类是有效的 ObservedType.这 旧维基文章 提供了一些线索,当它说

请注意,插件功能不适用于 -没有依赖注入创建的类,即直接用operator new创建,-Final方法,-Final类

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

在我开始使用Magento2拦截器之前,主要是试图让我的头脑了解可以做什么和不能做什么。

有帮助吗?

解决方案

每类Magento模块都是Intercaptable。

如当前的Wiki上描述,它受到最终方法和类别的限制

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

限制如何创建的对象不再是真的,我认为,至少如果正确配置了自动装载器。而且不重要,因为它们不会在飞行中创建,但是当发电机被执行时。(所以它只是一个问题,Magento自动装装店应该是第一个)

其他提示

我们正在研究“@api”注释来注释推荐方法,这些方法将更加稳定。如果您担心升级性,则在 CAN 具有所定义的插件的附加情况下,您还应该考虑应该是veraber pervice的plugin。我们不建议拦截非@ API方法,但有时我们知道这可能是最好的选择。 (我们将其留给开发人员的自行决定。)

正式,您可以拦截不是最终的公共方法。私人方法绝对不会工作。从内存中,拦截目前通过创建继承真实类的后代类(依赖注入框架在询问真实类的新实例时创建生成的类的实例)。因此,任何将要创建的子类和原始方法储存的任何东西都可能有效,但建议使用公共方法,让我们在未来使用其他一些其他聪明的实施(无充分原因永远不会发生逼真) 。

我知道这已经有了答案,但它来自2年前。也许在此期间有些事情发生了变化。

这是我迄今为止发现的。
正式文件 从挖掘拦截过程中。

我会回答相反的问题。
什么 不能 在Magento2中被拦截。
来自官方文档

  • 在Magento\Framework\Interception被引导之前实例化的对象(不确定该点在哪里)
  • 最终方法
  • 来自final类的任何方法(因为生成的拦截器类必须扩展原始类)
  • 包含至少一个最终公共方法的任何类
  • 非公共方法(它可以为受保护的方法工作,但这不是"道德的",因为它会将非公共方法暴露给类的外部)
  • 静态方法
  • _[医]结构
  • 虚拟类型

从四处挖掘

  • 未通过对象管理器实例化的类中的方法。(例 \Magento\Framework\Phrase)
  • 实现类 \Magento\Framework\ObjectManager\NoninterceptableInterface.(例如 \Magento\Framework\App\Cache\Proxy 和所有其他自动生成的代理)
许可以下: CC-BY-SA归因
scroll top