当前位置: 首页>>技术教程>>正文


Magento 2中的“Intercept-able/Plugin-able”是什么类

webfans 技术教程 , , , , 去评论

问题描述

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

Magento 2推出了a plugin concept,实现了via an interceptor pattern

文档中不清楚的是 – Magento中的哪些类和对象是”intercept-able”?也就是说,您使用XML配置插件,如下所示

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

但目前尚不清楚哪些类作为ObservedType有效。这个older wiki article提供了一些线索

Please note that the plugin feature does not apply to – Classes created without dependency injection, that is, created with operator new directly, -Final methods, -Final classes

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

在我开始使用Magento 2拦截器之前,我主要试图了解可以做什么和不能做什么。

最佳解决方法

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

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

未经验证,但不允许(/should)类的库(lib目录)被截获。

我认为,对象创建的限制不再是真实的,至少在自动加载器配置正确的情况下。并不应该重要,因为它们不会在运行中创建,但是当生成器被执行时。 (所以这只是一个问题,magento自动加载器应该是第一个)

次佳解决方法

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

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

第三种解决方法

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

这是我到目前为止所发现的。从official documentation和挖掘到拦截过程。

我会回答相反的问题。什么不能在Magento中截获2.来自官方文件

  • 在Magento \ Framework \ Interception被引导之前实例化的对象(不确定该点在哪里)

  • 最后的方法

  • 来自final类的任何方法(因为生成的拦截器类必须扩展原始类)

  • 任何包含至少一个最终公共方法的类

  • Non-public方法(它可以用于受保护的方法,但这不是”ethical”,因为它会将non-public方法暴露给类的外部)

  • 静态方法

  • __构造

  • 虚拟类型

从挖掘

  • 未通过对象管理器实例化的类中的方法。 (例\Magento\Framework\Phrase)

  • 实现\Magento\Framework\ObjectManager\NoninterceptableInterface的类。 (例如\Magento\Framework\App\Cache\Proxy和所有其他自动生成的代理)

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2764.html,转载请务必附带本地址声明。