Réécriture de classe Magento 1 dans Magento 2 avec système d'injection de dépendance

10

En fouillant le code de base de Magento 2 , il semble que l'ancien système de réécriture de classe ait été arraché et remplacé par un nouveau système d'injection de dépendances.

Malheureusement, il n'y a pas de documentation pour ce nouveau système.

Quelqu'un a-t-il un exemple de configuration de module qui permettrait à un utilisateur, dans Magento 2, de "réécrire" la classe Mage_Catalog_Model_Productavec une nouvelle classe Packagename_Modulename_Model_Product, en utilisant le nouveau système d'injection de dépendances?

Alan Storm
la source
Je pensais que les questions sur Magento 2.0 n'étaient pas encore autorisées meta.magento.stackexchange.com/questions/79/…
Marius

Réponses:

10

La configuration Di a été déplacée vers les fichiers di.xml et le format a été modifié. Maintenant, les préférences ressemblent à ceci (di.xml):

<config>
    <preference for="{Interface_Or_Class_Name}" type="{Preferred_Class_Name}" />
</config>
Anton Kril
la source
s'il s'agit d'une réécriture de classe, est-il préférable d'utiliser un plugin au lieu d'un nœud de préférence?
huzefam
2
Si vous devez remplacer le comportement d'une classe principale, vous devez utiliser la préférence. Si vous devez remplacer le comportement d'une méthode principale, vous devez utiliser un plugin avec un écouteur around qui n'appellera pas $ procéder (). Si vous devez ajouter un comportement à une méthode ou à une classe de base, vous devez utiliser des plugins.
Anton Kril
5

En travaillant de l'intérieur vers l'extérieur, j'ai pu obtenir une réécriture avec les éléments suivants

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

Cependant, il y a beaucoup plus de code système dans l'implémentation de l'injection de dépendance, donc il n'est pas clair si ce qui précède fonctionnera dans la version finale de Magento 2.

Alan Storm
la source
Il semble donc qu'ils aient fondamentalement renommé "alias" en préférences et l'ont déplacé vers le haut? Intéressant. J'ai hâte de voir les mises à jour de la documentation se déployer. Peter a dit qu'ils l'avaient, mais tout n'a pas été diffusé sur le site de documentation, du moins l'IIRC.
davidalger
5

Vous avez raison, les réécritures de classe ont été entièrement éliminées et remplacées par DI. Les notes suivantes sont extraites de la section sur les modifications du cadre d'application :

Magento 1.x - Noeud: / global // {sous-chemin qui correspond au nom d'usine + "réécriture" littéral}

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

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

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

Je n'ai pas essayé de l'utiliser dans un module fonctionnant dans Magento 2.0, mais il semble que vous définissiez essentiellement un alias pour le nom de classe au lieu d'utiliser la hiérarchie compliquée de xml pour les réécritures par module.

davidalger
la source
1
+1 pour la page Application Framework, mais cela ne fonctionne pas dans le dernier instantané de Magento 2 que j'ai saisi.
Alan Storm