magento2中的虚拟类型-virtual types是一个比较难理解的地方,今天我们介绍一下magento2中的虚拟类型--virtual types.
虚拟类型是Magento的一个非常巧妙的功能,它允许我们更改特定可注入依赖项的参数,从而更改特定类类型的行为。
<MAGENTO_DIR>/module checkout/etc/di.xml文件提供了virtualType及其用法的简单示例:
<virtualType name="Magento\Checkout\Model\Session\Storage" type="Magento\Framework\Session\Storage">
<arguments>
<argument name="namespace" xsi:type="string">checkout</argument>
</arguments>
</virtualType>
<type name="Magento\Checkout\Model\Session">
<arguments>
<argument name="storage" xsi:type="object">Magento\Checkout\Model\Session\Storage</argument>
</arguments>
</type>
这里的virtualType(实际上)通过将其构造函数的namespace='checkout'来扩展Magento\Framework\Session\Storage。但是,这一更改本身并没有生效,因为必须首先使用Magento\Checkout\Model\Session\Storage虚拟类型。在这种情况下,它是通过类型定义使用的,其中存储参数完全被虚拟类型取代。
Magento中的大多数virtualType名称属性都采用了不存在的完全限定类名的形式,尽管这可以是PHP数组键中允许的任何字符组合。通过在整个<Magento_DIR>目录的di.xml文件中查找<virtualType字符串,我们可以看到Magento在其大多数模块中使用了数百个虚拟类型。
在Magento_LayeredNavigation模块下可以找到一个更复杂的虚拟类型使用示例。<Magento_DIR>/module layered navigation/etc/frontend/di.xml文件定义了两个虚拟类型,如下所示:
<virtualType name="Magento\LayeredNavigation\Block\Navigation\Category" type="Magento\LayeredNavigation\Block\Navigation">
<arguments>
<argument name="filterList" xsi:type="object">categoryFilterList</argument>
</arguments>
</virtualType>
<virtualType name="Magento\LayeredNavigation\Block\Navigation\Search" type="Magento\LayeredNavigation\Block\Navigation">
<arguments>
<argument name="filterList" xsi:type="object">searchFilterList</argument>
</arguments>
</virtualType>
这里,我们定义了两个虚拟类型,每个类型都更改了Magento\LayeredNavigation\Block\Navigation类的filterList参数。tegoryFilterList和searchFilterList是<Magento_DIR>/module catalog search/etc/di.xml中定义的另外两个虚拟类型的名称
然后,在布局文件中使用Magento\LayeredNavigation\Plock\Navigation\Category和Magento\layedNavigation\Block\Navigation\Search虚拟类型进行块定义,如下所示:
<!-- view/frontend/layout/catalog_category_view_type_layered.xml -->
<referenceContainer name="sidebar.main">
<block class="Magento\LayeredNavigation\Block\Navigation\Category" ...
</referenceContainer>
<!-- view/frontend/layout/catalogsearch_result_index.xml -->
<referenceContainer name="sidebar.main">
<block class="Magento\LayeredNavigation\Block\Navigation\Search" ...
</referenceContainer>
这实际上是告诉Magento,对于类别视图页面和搜索页面,使用类的虚拟类型,从而指示它完成虚拟类型中指定的所有参数更改。
以上内容来自于码小课--Magento专区: