Magento 2 - Qual caso eu uso di.xml e como usar di.xml para o módulo?

Respostas:

51

What case We use di.xml ?

  • Podemos usar di.xml para (reescrever) a preferência de uma classe específica.
  • Podemos enviar novos ou substituir os argumentos de classe existentes .
  • Use plug-ins para fazer algumas coisas antes, depois e ao redor da função
  • Usando virtualTypes, criando uma subclasse de outra classe.

Vamos dar um exemplo rápido do módulo do cliente Magento 2.

1. preferência

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

Acima do código, quando alguém solicitar uma instância, Magento\Customer\Api\AddressRepositoryInterfaceele instancia um objeto Magento \ Customer \ Model \ ResourceModel \ AddressRepository (o atributo type).

A configuração de preferências de classe não é apenas para interfaces, também podemos alterar as classes reais.

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

Você pode criar a classe 'customModel' para 'CustomerManagement' e fazer as alterações. Sistema de preferência de classe como um substituto para o sistema de reescrita de classe.

http://alanstorm.com/magento_2_object_manager_preferences

2. Argumentos

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

No código acima, estamos enviando um objeto como argumento, estamos dizendo ao sistema para inserir a classe "Proxy" como um objeto com o nome de groupManagement. Além disso, também podemos usar Argumentos para substituir o argumento existente.

http://alanstorm.com/magento_2_object_manager_argument_replacement

3. Plugin

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

No código acima, public function clean($object)na classe visitante é chamado após a função pública afterClean(Visitor $subject, $logResourceModel)que está na classe Log.

4 Tipos Virtuais

Criar um tipo virtual é como criar uma subclasse para uma classe existente.

Para mais informações, consulte os exemplos práticos que eu mencionei como links de Alan. Na prática, você pode obter uma experiência mais clara.

Espero que isto ajude.... :)

Krishna ijjada
fonte
1
você tem alguma idéia sobre a configuração definida com ifconfig no di.xml para ativar / desativar o processo do módulo? se você sobre isso, por favor me ajude a resolver o problema.
Kartik Asodariya
Informação muito útil.
26418 Shivam
2
Como alguém aprende todas essas coisas?
Mohammed Joraid
Então, a <preferência> em vez de chamar a classe em "for", chama a classe em "type" ou algo assim? Eu ainda estou confuso sobre isso. @@
fudu 15/08/18
3
oh nvm, encontrei esta resposta muito boa aqui. inchoo.net/magento-2/overriding-classes-magento-2 :)
Fudu