了解虚拟类型的另一种方法-
假设您有一个类\Class1
,它具有以下构造函数-
public function __construct(\Class2 $argOfClass1){...}
并\Class2
具有以下构造函数-
public function __construct(\Class3 $argOfClass2){...}
现在,您想要将的类型$argOfClass2
从更改\Class3
为\Class4
,但仅当\Class2
用作时$argOfClass1
。
做到这一点的“旧”方法是在di.xml
-中添加以下内容:
<type name="Class1">
<arguments>
<argument name="argOfClass1" xsi:type="object">Class5</argument>
</arguments>
</type>
在\Class5
以下位置:
class \Class5 extends \Class2{
public function __construct(\Class4 $argOfClass2){...}
}
除了使用这种方式,您还可以通过以下方式使用虚拟类型来实现相同目的di.xml
:
<virtualType name="Class5" type="Class2">
<arguments>
<argument name="argOfClass2" xsi:type="string">Class4</argument>
</arguments>
</virtualType>
<type name="Class1">
<arguments>
<argument name="argOfClass1" xsi:type="object">Class5</argument>
</arguments>
</type>
如您所见,使用虚拟类型可以节省创建的工作Class5
。
作为参考,我建议阅读Alan Storm关于Magento2中虚拟类型的文章-http : //alanstorm.com/magento_2_object_manager_virtual_types/
Magento\Framework\ObjectManager\Config\Mapper\Dom::convert
。switch
某处有一个声明。