Magento 2 di.xml 用法解析
本文内容来自QQ群大佬陈伟明(一叶知秋)的学习分享
di定义了 ,由object manager 注入对象 这个文件相当重要,理解时有难度
参考 https://devdocs.magento.com/guides/v2.4/extension-dev-guide/build/di-xml-file.html
主要定义在下面3个场景:
- Initial (app/etc/di.xml)
- Global (<moduleDir>/etc/di.xml)
- Area-specific (<moduleDir>/etc/<area>/di.xml)
The areas are:
- adminhtml
- frontend
- webapi_rest
- webapi_soap
- crontab
这个配置比较核心,可配置很多项
-------------------------
构造方法的行为 注入
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <virtualType name="moduleConfig" type="Magento\Core\Model\Config"> <arguments> <argument name="type" xsi:type="string">system</argument> </arguments> </virtualType> <type name="Magento\Core\Model\App"> <arguments> <argument name="config" xsi:type="object">moduleConfig</argument> </arguments> </type> </config>
- * Magento\Core\Model\Config 的构造方法, 参数type 用了system
public function __construct($type='system'){} - * Magento\Core\Model\App 的构造方法,注入了 Magento\Core\Model\Config
public function __construct(Magento\Core\Model\Config $config){}
构造参数
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Core\Model\Session"> <arguments> <argument name="sessionName" xsi:type="string">adminhtml</argument> </arguments> </type> </config>
xsi:type:
object 类型
<argument xsi:type="object">{typeName}</argument> <argument xsi:type="object" shared="{shared}">{typeName}</argument>
- {typeName}可以是 class name, interface name, or virtual type
- {shared} 定义生命周期 主要是指单例(singleton)和短暂(Transient)的 默认是 singleton, 若是注入上传类,是要求每次实例化 shared="false"
string 类型
<argument xsi:type="string">{strValue}</argument> <argument xsi:type="string" translate="true">{strValue}</argument>
boolean 类型
<argument xsi:type="boolean">{boolValue}</argument>
其它类型值自动转换
NPUT TYPE DATA BOOLEAN VALUE
Boolean true true
Boolean false false
String “true”* true
String “false”* false
String “1” true
String “0” false
Integer 1 true
Integer 0 false
number
<argument xsi:type="number">{numericValue}</argument>
- {numericValue} 整数,小数, 数字字符串
init_parameter
<argument xsi:type="init_parameter">{Constant::NAME}</argument>
const 常量
<argument xsi:type="const">{Constant::NAME}</argument>
null
<argument xsi:type="null"/>
array 数组
<argument xsi:type="array"> <item name="someKey" xsi:type="<type>">someVal</item> </argument>
一个相对完整的例子:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Example\Type"> <arguments> <!-- Pass simple string --> <argument name="stringParam" xsi:type="string">someStringValue</argument> <!-- Pass instance of Magento\Some\Type --> <argument name="instanceParam" xsi:type="object">Magento\Some\Type</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">Magento\Some\Class::SOME_CONSTANT</argument> <!-- Pass constant value --> <argument name="constantParam" xsi:type="const">Magento\Some\Class::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">Magento\Some\Class::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">Magento\Some\Class::SOME_CONSTANT</item> </item> </argument> </arguments> </type> </config>
-------------------------------
接口实现 ,方便代码书写只要注入接口约事即可
<config> <preference for="Magento\Core\Model\UrlInterface" type="Magento\Core\Model\Url" /> </config>
Magento\Core\Model\Url 去实现接口
这样定义后,前端就可以用 Magento\Core\Model\UrlInterface 注入
public function __struction(Magento\Core\Model\UrlInterface $url)
后端的
<config> <preference for="Magento\Core\Model\UrlInterface" type="Magento\Backend\Model\Url" /> </config>
app/code/Magento/Backend/etc/adminhtml/di.xml 放在 adminhtml/di.xml中
重写方法:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Checkout\Block\Onepage\Success" type="ExampleCorp\OverrideExample\Block\Onepage\Success" /> </config>
namespace ExampleCorp\OverrideExample\Block\Onepage; class Success extends \Magento\Checkout\Block\Onepage\Success { /** * Constructor Modification * * @param \Magento\Framework\View\Element\Template\Context $context * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Magento\Sales\Model\Order\Config $orderConfig * @param \Magento\Framework\App\Http\Context $httpContext * @param array $data */ public function __construct( \Magento\Framework\View\Element\Template\Context $context, \Magento\Checkout\Model\Session $checkoutSession, \Magento\Sales\Model\Order\Config $orderConfig, \Magento\Framework\App\Http\Context $httpContext, array $data = [] ) { parent::__construct( $context, $checkoutSession, $orderConfig, $httpContext, $data ); } /** * Is order visible * * @param Order $order * @return bool */ protected function isVisible(Order $order) { # Write your custom logic here. return !in_array( $order->getStatus(), $this->_orderConfig->getInvisibleOnFrontStatuses() ); } }
重写了 isVisible()方法,重写整个方法不建议,建议采用 plugins 或event
---------------------
参数配置继承:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Framework\View\Element\Context"> <arguments> <argument name="urlBuilder" xsi:type="object">Magento\Core\Model\Url</argument> </arguments> </type> <type name="Magento\Backend\Block\Context"> <arguments> <argument name="urlBuilder" xsi:type="object">Magento\Backend\Model\Url</argument> </arguments> </type> </config>
Magento\Backend\Block\Context 是 Magento\Framework\View\Element\Context子类 urlBuilder进行的覆盖配置
------------------------
敏感项或环境项指定
<type name="Magento\Config\Model\Config\TypePool"> <arguments> <argument name="VALUE_TYPE" xsi:type="array"> <item name="CONFIG_PATH" xsi:type="string">ARGUMENT_VALUE</item> </argument> </arguments> </type>
- VALUE_TYPE: Specifies the type of value: either sensitive or environment.
- CONFIG_PATH: A unique, /-delimited string that identifies this configuration setting.
- ARGUMENT_VALUE: A value of 1 indicates the CONFIG_PATH value is sensitive or system-specific. The default 0 value indicates it is neither sensitive nor system specific.