Magento 2: ¿en qué caso utilizo di.xml y cómo usar di.xml para el módulo?

Respuestas:

53

What case We use di.xml ?

  • Podemos usar di.xml para (reescribir) la preferencia de una clase en particular.
  • Podemos enviar nuevos o reemplazar los argumentos de clase existentes .
  • Use complementos para hacer algunas cosas antes, después y alrededor de la función
  • Mediante el uso de virtualTypes creando una subclase de otra clase.

Tomemos un ejemplo rápido del módulo de cliente Magento 2.

1. referencia

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

Código anterior, cuando alguien le pide que cree una instancia Magento\Customer\Api\AddressRepositoryInterface, creará una instancia de un objeto Magento \ Customer \ Model \ ResourceModel \ AddressRepository (el atributo type).

La configuración de preferencia de clase no es solo para interfaces, también podemos cambiar las clases reales.

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

Puede crear la clase 'customModel' para 'CustomerManagement' y hacer los cambios. Sistema de preferencia de clase como un reemplazo para el sistema de reescritura de clase.

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>

En el código anterior, estamos enviando un objeto como argumento, estamos diciendo sistema para insertar la clase "Proxy" como un objeto con el nombre de groupManagement. Además, también podemos usar Argumentos para reemplazar el argumento existente.

http://alanstorm.com/magento_2_object_manager_argument_replacement

3. Complemento

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

En el código anterior, public function clean($object)en la clase visitante se llama a la función pública afterClean(Visitor $subject, $logResourceModel)que está en la clase Log.

4 tipos virtuales

Crear un tipo virtual es algo así como crear una subclase para una clase existente.

Para obtener más notas, consulte los ejemplos prácticos que mencioné como enlaces de Alan; en la práctica, puede obtener una experiencia más clara.

Espero que esto ayude.... :)

Krishna ijjada
fuente
1
¿Tiene alguna idea sobre la configuración del conjunto con ifconfig en di.xml para habilitar / deshabilitar el proceso del módulo? Si se trata de eso, ayúdame a resolver el problema.
Kartik Asodariya
Información muy útil.
Shivam
2
¿Cómo alguien aprende todas estas cosas?
Mohammed Joraid
Entonces, ¿la <preferencia> en lugar de llamar a la clase en "for", llama a la clase en "type" o algo así? Todavía estoy confundido sobre esto. @@
fudu
3
oh nvm, encontré esta muy buena respuesta aquí. inchoo.net/magento-2/overriding-classes-magento-2 :)
fudu