Что такое «virtualType», и как его использовать

virtualtype
Внедрение-зависимости

(Дмитрий Федюк) #1

Покажу на примере стандартного виджета catalog_product_link:

Как Вы видите, для виджета указао класс PHP Magento\Catalog\Block\Product\Widget\Link, однако если Вы поищете этот класс в программном коде Magento 2, то не найдёте его. Этого класса не существует, это и есть пример virtualType:

Класс Magento\Catalog\Block\Product\Widget\Link на самом деле является классом Magento\Catalog\Block\Widget\Link, однако со своим особенным внедрением завимости: аргумент entityResource его конструктора имеет тип Magento\Catalog\Model\ResourceModel\Product.

Посмотрите на конструктор реального класса Magento\Catalog\Block\Widget\Link:

Как Вы видите, аргумент entityResource его конструктора имеет тип Magento\Catalog\Model\ResourceModel\AbstractResource.

Когда же Вы используете виртуальное имя Magento\Catalog\Block\Product\Widget\Link, то аргумент entityResource будет иметь тип Magento\Catalog\Model\ResourceModel\Product.

Дополнительное пояснение на StackExchange: http://magento.stackexchange.com/a/33140/18793