Reescritura de clase Magento 1 en Magento 2 con sistema de inyección de dependencia

10

Escudriñando el código central de Magento 2 , parece que el viejo sistema de reescritura de clase ha sido arrancado y reemplazado por un nuevo sistema de inyección de dependencia.

Desafortunadamente, no hay documentación para este nuevo sistema.

¿Alguien tiene una muestra de configuración de módulo que permita a un usuario, en Magento 2, "reescribir" la clase Mage_Catalog_Model_Productcon una nueva clase Packagename_Modulename_Model_Product, utilizando el nuevo sistema de inyección de dependencia?

Alan Storm
fuente
Pensé que las preguntas de Magento 2.0 aún no estaban permitidas meta.magento.stackexchange.com/questions/79/…
Marius

Respuestas:

10

La configuración de Di se movió a archivos di.xml y se modificó el formato. Ahora las preferencias se ven así (di.xml):

<config>
    <preference for="{Interface_Or_Class_Name}" type="{Preferred_Class_Name}" />
</config>
Anton Kril
fuente
Si es una reescritura de clase, ¿es preferible usar un complemento en lugar de un nodo de preferencia?
huzefam
2
Si necesita sustituir el comportamiento de alguna clase principal, debe usar preferencia. Si necesita sustituir el comportamiento de algún método central, debe usar un complemento con alrededor de listener que no llame a $ continue (). Si necesita agregar comportamiento a algún método o clase principal, debe usar complementos.
Anton Kril el
5

Trabajando de adentro hacia afuera, pude obtener una reescritura trabajando con lo siguiente

<global>    
    <di>    
        <preferences>
            <Mage_Catalog_Model_Product>Packagename_Modulename_Model_Product</Mage_Catalog_Model_Product>
        </preferences> 
    </di>
</global>

Sin embargo, hay mucho más código de sistemas en la implementación de inyección de dependencia, por lo que no está claro si lo anterior funcionará en la versión final lanzada de Magento 2.

Alan Storm
fuente
Entonces, ¿parece que básicamente cambiaron el nombre de "alias" a preferencias y lo movieron a la parte superior? Interesante. Espero ver las actualizaciones de la documentación desplegada. Peter dijo que lo tienen, pero no todo ha sido enviado al sitio de documentos, al menos IIRC.
davidalger
5

Tienes razón, las reescrituras de clase se eliminaron por completo y se reemplazaron con DI. Las siguientes notas son de la sección sobre cambios en el Marco de aplicación :

Magento 1.x - Nodo: / global // {subruta que corresponde al nombre de fábrica + literal "reescribir"}

<global>
...
    <models>
        <core>
            <rewrite>
                <url>My_Module_Model_Url</url>
            </rewrite>
        </core>
    </models>
...
</global>

Magento 2.x - Nodo: / global / di / aliases

<global>
...
    <di>
        <aliases>
            <Mage_Core_Model_Url>My_Module_Model_Url</Mage_Core_Model_Url>
        </aliases>
    </di>
...
</global>

No he intentado utilizar esto en un módulo que se ejecuta en Magento 2.0, pero parece que básicamente define un alias para el nombre de la clase en lugar de utilizar la complicada jerarquía de xml para reescrituras por módulo.

davidalger
fuente
1
+1 para la página Marco de aplicación, pero esto no funciona en la última instantánea de Magento 2 que tomé.
Alan Storm