Magento 2代理类覆盖


8

我需要\Magento\Catalog\Model\Product\Link使用首选项覆盖该类,这可以正常工作,但是上述类具有自动生成的代理类\Magento\Catalog\Model\Product\Link\Proxy,该代理类不包括在覆盖中添加的新方法。有什么方法可以将这些方法注入代理类中?

编辑

我试图对此进行深入研究,发现我们可以使用di.xml注入代理。但是,当我尝试这样做时,出现了类Package\Module\Model\Class\Proxy不存在的异常。这意味着我尝试生成的新代理不会自动生成。


Taral,您的Magento实例是否设置为开发人员模式?如果不是,则需要编译di才能生成代理。
伊万·谢普尔尼

为什么要向此类添加方法?
康迪

Ivan,我的magento实例处于开发人员模式
Taral Patoliya

@KAndy我需要添加相关产品的确切功能,因此,为此,我需要为新的链接类型添加一些方法。正如我注意到的那样,每个链接类型(相关,cross_sell,向上销售)在该类中都有自己的方法。
Taral Patoliya

你就不能手动创建和设置代理类di.xml的偏好\Magento\Catalog\Model\Product\Link\ProxyPackage\Module\Model\Class\Proxy
马里斯(Marius)

Answers:


5

阅读您发表的评论后:

我做了类似的事情,它奏效了。我已经解决了这个问题。但我想生成一个包含新方法的新代理类。由于代理类用于减少初始化类的负担。现在,由于不再使用代理类,因此原始类将承担更多的服务器负载。但我认为它可以忽略不计。

您要解决的整个问题可以更优雅,更轻松地完成。

如果您只是向现有实现中添加了新方法,则意味着您不会更改原始类的行为

  1. 您应该避免扩展现有类的公共方法,而希望创建自己的类,该类使用原始类作为依赖项
  2. 然后在您使用原始语言的地方通过课堂

这为您带来了以下附带好处:

  1. 您的代码更易于测试(单一依赖比模拟所有核心依赖)
  2. 不违反单一责任原则
  3. 它不会影响您意想不到的地方的核心
  4. 它使您的业务逻辑与核心实现脱钩

2

Proxy.php通过将以下内容添加到模块中,我设法生成了包含新功能的正确文件di.xml

<type name="Magento\Catalog\Model\Product">
    <arguments>
        <argument name="productLink" xsi:type="object">Package\Module\Model\Product\Link\Proxy</argument>
    </arguments>
</type>

感谢@minlare的帮助

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.