Magento 2 - di.xml虚拟类型 - 覆盖类

时间:2016-11-29 17:46:18

标签: php xml magento magento2

我有一个覆盖ShippingMethodConverter类的模块。我在di.xml中进行了配置,如下所示:

<preference for="Magento\Quote\Model\Cart\ShippingMethodConverter"
            type="MyNameSpace\MyModule\Quote\Model\Cart\ShippingMethodConverter"/>                                

<virtualType name="mynamespace_mymodule_quote_mode_cart_shippingmethodconverter" type="\MyNameSpace\MyModule\Quote\Model\Cart\ShippingMethodConverter">
    <arguments>
        <argument name="shippingMethodConverter" xsi:type="object">\Magento\Quote\Model\Cart\ShippingMethodConverter</argument>
    </arguments>
</virtualType>

不幸的是我收到了以下错误:

1 exception(s):
Exception #0 (Exception): Recoverable Error: Argument 2 passed to 
Magento\Quote\Model\ShippingMethodManagement::__construct() 
must be an instance of Magento\Quote\Model\Cart\ShippingMethodConverter, 
instance of MyNameSpace\MyModule\Quote\Model\Cart\ShippingMethodConverter given, 
called in /path_to_magento/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php 
on line 93 and defined in 
/path_to_magento/vendor/magento/module-quote/Model/ShippingMethodManagement.php on line 62

我的班级开头是这样的:

namespace MyNameSpace\MyModule\Quote\Model\Cart;

/**
 * Quote shipping method data.
 *
 */
class ShippingMethodConverter
{
..

正如我正确理解virtualType,我想说我的类应该像给定的参数一样处理,以保证magento核心中没有类型解析错误。

1 个答案:

答案 0 :(得分:1)

您看到的错误基于此

<preference for="Magento\Quote\Model\Cart\ShippingMethodConverter"
            type="MyNameSpace\MyModule\Quote\Model\Cart\ShippingMethodConverter"/>

使用此配置,您可以告诉Magento的自动构造函数依赖注入系统,只要它在构造函数中看到Magento\Quote\Model\Cart\ShippingMethodConverter,它就应该实例化MyNameSpace\MyModule\Quote\Model\Cart\ShippingMethodConverter对象而不是Magento\Quote\Model\Cart\ShippingMethodConverter对象{1}}对象。

Magento正确地执行了此操作,但由于您的对象在构造函数中未通过类型提示检查,因此PHP出现错误。您的类需要扩展Magento\Quote\Model\Cart\ShippingMethodConverter类(或者如果Magento\Quote\Model\Cart\ShippingMethodConverter是接口,则实现它)