使用 Magento 2 虚拟类型

当你运行基于 Magento 2 平台的虚拟商店时,使用虚拟类型是非常有必要的。在 Magento 2 平台中,di.xml 支持两种节点的类型,分别是 type 和 virtualtype ,同时,virtualtype被认为是代替type的一种理想方法。virtual tape 允许向已经存在的类中插入不同的依赖,而对其它类做出修改,根据本篇教程,Mageplaza 团队会引导你学会如何在 Magento 2 中创建和使用虚拟类型。

在 Magento 2 中创建虚拟类型(VirtualType)

在 Magento 2 中创建虚拟类型就是给已有的类创建一个子类,以下内容可以帮助您在 Magento 2 中创建虚拟类型。

<?php
class OurVirtualTypeName extends \Mageplaza\HelloWorld\Model\Virtualtype
{
}

将以下脚本代码插入到模块的 di.xml 中,用来在 Magento 2 中创建一个虚拟类型。

#File: app/code/Mageplaza/HelloWorld/etc/di.xml
<config>
    <!-- ... -->
    <virtualType name="ourVirtualTypeName" type="Mageplaza\HelloWorld\Model\Virtualtype">  
    </virtualType>        
</config>

也就是说,这个节点被放在主节点下,同时包含了两个属性:name 和 type。虽然 name 属性是这个节点的主要特殊的通用名称,但是,虚拟类型的type 属性是真实的 PHP。

如你所见,给出虚拟类型的一些描述是非常简单的。如果您清除缓存并重复请求,则输出结果仍然是相同的。

$ php bin/magento hw:tutorial-virtual-type
First, we'll report on the Mageplaza\HelloWorld\Model\Example object
The Property $property_of_example_object
  is an object
  created with the class: 
  Mageplaza\HelloWorld\Model\Virtualtype

Next, we're going to report on the Example object's one property (an Virtualtype class)
The Property $property_of_argument1_object
  is an object
  created with the class: 
  Mageplaza\HelloWorld\Model\Argument2

Finally, we'll report on an Virtualtype object, instantiated separate from Example
The Property $property_of_argument1_object
  is an object
  created with the class: 
  Mageplaza\HelloWorld\Model\Argument2

在 Magento 2 中使用虚拟类型

虚拟类型的功能取代了 PHP 类的位置,如果你要将自定义参数注入到 Example 类的构造函数中,您就没有必要使用以下配置了。

#File: app/code/Mageplaza/HelloWorld/etc/di.xml    
<config>
    <!-- ... -->
    <virtualType name="ourVirtualTypeName" type="Mageplaza\HelloWorld\Model\Virtualtype">  
    </virtualType>        

    <type name="Mageplaza\HelloWorld\Model\Example">
        <arguments>
            <argument name="the_object" xsi:type="object">Some\Other\Class</argument>
        </arguments>
    </type>        

</config>

但是,即使已经清除了缓存,应用该命令也会导致以下错误。

$ php bin/magento hw:tutorial-virtual-type

  [ReflectionException]                  
  Class Some\Other\Class does not exist 

让我们用一种更聪明的方式使用虚拟类型。这意味着 Some\Other\Class 可以被 ourVirtualTypeName 恢复。您可以确保不会导致任何错误,除非您使用上述命令调用命令。

#File: app/code/Mageplaza/HelloWorld/etc/di.xml      
<config>
    <!-- ... -->
    <virtualType name="ourVirtualTypeName" type="Mageplaza\HelloWorld\Model\Virtualtype">  
    </virtualType>        

    <type name="Mageplaza\HelloWorld\Model\Example">
        <arguments>
            <argument name="the_object" xsi:type="object">ourVirtualTypeName</argument>
        </arguments>
    </type>        

</config>

本教程翻译自Mageplaza模块开发系列,其他内容请点击下面链接: