Magento2中哪些类是"拦截能力/插件能力"
-
13-12-2019 - |
题
日期:五月三十日 (鉴于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
和所有其他自动生成的代理)