2016-11-29 2 views
3

У меня есть модуль, который переопределяет класс ShippingMethodConverter. Я сделал конфигурацию в моем di.xml так:Magento 2 - 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

Ошибки вы видите на основе этого

<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.

Magento делает это правильно, но из-за того, что ваш объект не прошел проверку типа в конструкторе, PHP запустил ошибку. Ваш класс должен расширить класс Magento\Quote\Model\Cart\ShippingMethodConverter (или реализовать его, если Magento\Quote\Model\Cart\ShippingMethodConverter - это интерфейс)

+0

благодарим за ответ. Знайте, что это отлично работает для ShippingMethodConverter. У меня есть еще один вопрос об интерфейсе, который я хочу переопределить. Причина: Я получил следующую ошибку: Не удалось создать интерфейс MyNameSpace \ MyModule \ Quote \ Api \ Data \ ShippingMethodInterface. Поскольку я правильно понял это, я могу назначить класс, а не интерфейс для виртуального типа. Или как это работает с интерфейсами? Заранее спасибо –

+0

@StephanHofmann Я боюсь, что это слишком неопределенно для меня, чтобы ответить со 100% уверенностью, но похоже, что ваша конфигурация пытается создать интерфейс. Вам понадобится создать '' для вашего интерфейса, который сообщил Magento, какой конкретный класс он должен создать, когда он встречает «MyNameSpace \ MyModule \ Quote \ Api \ Data \ ShippingMethodInterface' –

 Смежные вопросы

  • Нет связанных вопросов^_^