• di.xml


    di.xml文件

    di.xml文件配置对象管理器要注入的依赖项

    领域和应用入口点

    每个 模块 都可以具有全局和区域特定的di.xml文件。Magento读取di.xml系统中声明的所有配置文件,并通过附加所有节点将它们合并在一起。

    作为一般规则,区域特定di.xml文件应配置表示层的依赖关系,并且模块的全局di.xml文件应配置其余依赖关系。

    Magento在以下阶段加载配置:

    1. 初始(app/etc/di.xml
    2. 全局(<moduleDir>/etc/di.xml
    3. 特定区域(<moduleDir>/etc/<area>/di.xml

    引导期间,每个应用程序入口点都会加载di.xml所请求区域的相应文件

    例子:

    输入配置

    类型配置描述了对象的生活方式以及如何实例化它。

    您可以di.xml通过以下方式配置节点中配置类型

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <virtualType name="moduleConfig" type="MagentoCoreModelConfig">
            <arguments>
                <argument name="type" xsi:type="string">system</argument>
            </arguments>
        </virtualType>
        <type name="MagentoCoreModelApp">
            <arguments>
                <argument name="config" xsi:type="object">moduleConfig</argument>
            </arguments>
        </type>
    </config>
     

    前面的示例声明了以下类型:

    • moduleConfig:扩展类型的虚拟类型MagentoCoreModelConfig
    • MagentoCoreModelApp:此类型的所有实例都接收moduleConfig作为依赖项的实例

    虚拟类型

    一个 虚拟的类型 ,您可以更改特定注射依赖的论据和改变特定类的行为。这允许您使用自定义类,而不会影响其他依赖于原始类的类。

    该示例为for创建虚拟类型,MagentoCoreModelConfig并指定system为构造函数参数type

    构造函数参数

    您可以di.xml在参数节点中配置类构造函数参数。对象管理器在创建期间将这些参数注入到类中。XML 文件中配置 的参数名称必须与配置的类中构造函数中的参数名称相对应。

    以下示例创建实例,MagentoCoreModelSession其中类构造函数参数$sessionName设置为以下值adminhtml

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <type name="MagentoCoreModelSession">
            <arguments>
                <argument name="sessionName" xsi:type="string">adminhtml</argument>
            </arguments>
        </type>
    </config>
     

    参数类型

    object

    节点格式:

    <argument xsi:type="object">{typeName}</argument>

    <argument xsi:type="object" shared="{shared}">{typeName}</argument>

    创建一个typeName类型的实例并将其作为参数传递。您可以传递任何类名,接口名或虚拟类型typeName

    设置shared属性定义已创建实例的生活方式。对象的生活方式配置


    string

    节点格式:

    <argument xsi:type="string">{strValue}</argument>

    <argument xsi:type="string" translate="true">{strValue}</argument>

    Magento将此参数节点的任何值解释为字符串。


    boolean

    节点格式:

    <argument xsi:type="boolean">{boolValue}</argument>

    Magento将此参数节点的任何值转换为布尔值。见下表:

    输入类型数据布尔值
    布尔 真正 真正
    布尔
    “真正”* 真正
    “假”*
    “1” 真正
    “0”
    整数 1 真正
    整数 0

    *这些字符串文字区分大小写


    number

    节点格式:

    <argument xsi:type="number">{numericValue}</argument>

    此类型的可接受值包括:整数,浮点数或数字字符串


    init_parameter

    节点格式:

    <argument xsi:type="init_parameter">{Constant::NAME}</argument>

    这是由全局应用程序初始化参数表示的Constant::NAME


    const

    节点格式:

    <argument xsi:type="const">{Constant::NAME}</argument>

    这是由...表示的常数值Constant::NAME


    null

    节点格式:

    <argument xsi:type="null"/>

    这表示空值。


    array

    节点格式:
    <argument xsi:type="array">
      <item name="someKey" xsi:type="<type>">someVal</item>
    </argument>
    
     

    Magento使用与项目对应的元素构建一个数组,并将其作为参数传递。该数组可以包含无限数量的项,每个数组项可以是任何对象类型,包括数组本身。

    当Magento合并给定范围的配置文件时,具有相同名称的数组参数将合并到一个新数组中。

    当Magento稍后通过更具体的范围或通过代码加载新配置时,新配置中的任何数组定义都将替换加载的配置而不是合并。


    参数示例:

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <type name="MagentoExampleType">
            <arguments>
                <!-- Pass simple string -->
                <argument name="stringParam" xsi:type="string">someStringValue</argument>
                <!-- Pass instance of MagentoSomeType -->
                <argument name="instanceParam" xsi:type="object">MagentoSomeType</argument>
                <!-- Pass true -->
                <argument name="boolParam" xsi:type="boolean">1</argument>
                <!-- Pass 1 -->
                <argument name="intParam" xsi:type="number">1</argument>
                <!-- Pass application init argument, named by constant value -->
                <argument name="globalInitParam" xsi:type="init_parameter">MagentoSomeClass::SOME_CONSTANT</argument>
                <!-- Pass constant value -->
                <argument name="constantParam" xsi:type="const">MagentoSomeClass::SOME_CONSTANT</argument>
                <!-- Pass null value -->
                <argument name="optionalParam" xsi:type="null"/>
                <!-- Pass array -->
                <argument name="arrayParam" xsi:type="array">
                    <!-- First element is value of constant -->
                    <item name="firstElem" xsi:type="const">MagentoSomeClass::SOME_CONSTANT</item>
                    <!-- Second element is null -->
                    <item name="secondElem" xsi:type="null"/>
                    <!-- Third element is a subarray -->
                    <item name="thirdElem" xsi:type="array">
                        <!-- Subarray contains scalar value -->
                        <item name="scalarValue" xsi:type="string">ScalarValue</item>
                        <!-- and application init argument -->
                        <item name="globalArgument " xsi:type="init_parameter">MagentoSomeClass::SOME_CONSTANT</item>
                    </item>
                </argument>
            </arguments>
        </type>
    </config>
     

    合并和争论

    在合并期间,如果类型不同,则参数将替换具有相同名称的其他参数。如果参数类型相同,则较新的参数将替换旧参数。

    抽象实现映射

    当类的构造函数签名通过其接口请求对象时,对象管理器使用抽象实现映射。对象管理器使用这些映射来确定特定范围的该类的默认实现。

    preference节点指定默认的实现:

    <!--  File: app/etc/di.xml -->
    <config>
        <preference for="MagentoCoreModelUrlInterface" type="MagentoCoreModelUrl" />
    </config>
     

    此映射位于app/etc/di.xml,因此对象管理器会在全局范围内MagentoCoreModelUrl有请求的地方注入实现类MagentoCoreModelUrlInterface

    <!-- File: app/code/core/Magento/Backend/etc/adminhtml/di.xml -->
    <config>
        <preference for="MagentoCoreModelUrlInterface" type="MagentoBackendModelUrl" />
    </config>
     

    此映射位于app/code/core/Magento/Backend/etc/adminhtml/di.xml,因此对象管理器会管理 区域中的MagentoBackendModelUrl任何请求中注入实现类MagentoCoreModelUrlInterface

    参数配置继承

    为类类型配置的参数将其配置传递给其后代类。任何后代都可以覆盖为其超类型配置的参数; 也就是父类或接口:

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <type name="MagentoFrameworkViewElementContext">
            <arguments>
                <argument name="urlBuilder" xsi:type="object">MagentoCoreModelUrl</argument>
            </arguments>
        </type>
        <type name="MagentoBackendBlockContext">
            <arguments>
                <argument name="urlBuilder" xsi:type="object">MagentoBackendModelUrl</argument>
            </arguments>
        </type>
    </config>
     

    在前面的例子中,MagentoBackendBlockContext是一个后代MagentoFrameworkViewElementContext

    第一个条目将所有实例MagentoFrameworkViewElementContext以及它的子项配置MagentoCoreModelUrl$urlBuilder在其构造函数中传入

    第二个条目会覆盖它并配置MagentoBackendBlockContextMagentoBackendModelUrl用作的所有实例$urlBuilder

    对象生活方式配置

    对象的生活方式决定了该对象可以存在的实例数。

    您可以在Magento中配置依赖项以具有以下生活方式:

    • singleton(默认) - 此类的一个实例存在。对象管理器在第一次请求时创建它。再次请求该类将返回相同的实例。处置或结束注册到它的容器会释放实例。
    • transient - 对象管理器为每个请求创建一个新的类实例。

    shared属性决定了两者的生活方式argumenttype配置。

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <type name="MagentoFilesystem" shared="false">
            <arguments>
                <argument name="adapter" xsi:type="object" shared="false">MagentoFilesystemAdapterLocal</argument>
            </arguments>
        </type>
    </config>
     

    在此示例MagentoFilesystem中不共享,因此所有客户端都将检索单独的实例MagentoFilesystem此外,每个实例都MagentoFilesystem将获得单独的实例$adapter,因为它也是非共享的。

  • 相关阅读:
    html2jspdf文档
    监听localstorage
    vue插件 webpack打包 style中的element样式没有打包进去
    css-loader导致vue中样式失效
    webpack vue-clii-service vite create-react-app umi对比
    react使用antd数据改变视图没更新原因
    npx
    Webpack原理—编写Loader和Plugin
    VUE Element el-input只能输入数字,限制数字长度,重写label宽度
    php--laravel --debug--mac
  • 原文地址:https://www.cnblogs.com/q1104460935/p/9314370.html
Copyright © 2020-2023  润新知