Magento 2-我在什么情况下使用di.xml以及如何在模块中使用di.xml?


Answers:


54

What case We use di.xml ?

  • 我们可以将di.xml用于(重写)特定类的首选项。
  • 我们可以发送新的或替换现有的类参数
  • 使用插件在该函数之前,之后和周围做一些事情
  • 通过使用virtualTypes创建另一个类的子类。

让我们以Magento 2客户模块为例。

1.偏好

<preference for="Magento\Customer\Api\AddressRepositoryInterface"
            type="Magento\Customer\Model\ResourceModel\AddressRepository" />

上面的代码,当有人要求您实例化一个实例时Magento\Customer\Api\AddressRepositoryInterface,它将实例化一个Magento \ Customer \ Model \ ResourceModel \ AddressRepository对象(type属性)。

类首选项配置不仅用于接口,我们还可以更改实际的类。

<preference for="Magento\Customer\Model\CustomerManagement"
            type="Magento\Customer\Model\customModel" />

您可以为“ CustomerManagement”创建“ customModel”类并进行更改。使用类首选项系统替代类重写系统。

http://alanstorm.com/magento_2_object_manager_preferences

2.争论

<type name="Magento\Customer\Model\ResourceModel\Group" shared="false">
    <arguments>
        <argument name="groupManagement" xsi:type="object">Magento\Customer\Api\GroupManagementInterface\Proxy</argument>
    </arguments>
</type>

在上面的代码中,我们将对象作为参数发送,我们说的是系统将名称为的“ Proxy”类作为对象插入groupManagement。另外,我们也可以使用Arguments替换现有参数。

http://alanstorm.com/magento_2_object_manager_argument_replacement

3.插件

<type name="Magento\Customer\Model\ResourceModel\Visitor">
    <plugin name="catalogLog" type="Magento\Catalog\Model\Plugin\Log" />
</type>

在上面的代码中, public function clean($object)访问者类afterClean(Visitor $subject, $logResourceModel)在Log类中的公共函数之后被调用。

4种虚拟类型

创建虚拟类型有点像为现有类创建子类。

有关更多注释,请阅读一些我作为Alan链接提到的实际示例,通过练习您可以获得更清晰的经验。

希望这可以帮助.... :)


1
您是否有关于在di.xml中使用ifconfig进行设置配置以启用/禁用模块进程的想法?如果您对此有疑问,请帮助我解决问题。
Kartik Asodariya

非常有用的信息。
Shivam '18 -4-26

2
某人如何学习所有这些东西?
Mohammed Joraid '18年

那么<preference>而不是在“ for”中调用类,而是在“ type”中调用类?我对此仍然感到困惑。@@
fudu

3
哦,NVM,我在这里找到了这个非常好的答案。inchoo.net/magento-2/overriding-classes-magento-2 :)
Fudu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.