Magento2: quelle est la différence fondamentale entre plugin et préférence?


47

J'ai utilisé les deux plugins et préférences dans magento2 tutorial et les deux fonctionnent bien, mais quelle est la différence fondamentale entre eux.

Code pour le plugin:

1.1) Ajoutez une déclaration de plugin dans di.xml:

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

1.2) Créer une classe de plugin:

<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}

Code de préférence:

2.1) Créer une déclaration de préférence:

<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />

2.2) Créer une nouvelle classe de produit:

<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}

Réponses:


59

Une préférence équivaut à une réécriture de classe à partir de Magento 1. Cela revient à dire: "Chaque fois que le code le demandera ClassA, donnez-leur MyClassBplutôt." MyClassBdevrait être une implémentation complète de ClassA, plus le comportement que vous ajoutez ou modifiez par le haut.

Comme dans Magento 1, une seule préférence (rewrite) peut être actif pour une classe à un moment à moins que vous les enchaînez manuellement (telle que MyClassBse prolonge OtherClassBet OtherClassBétend ClassA).

Un plugin vous permet d'exécuter du code avant, autour ou après les méthodes de la classe à laquelle vous vous connectez. Votre classe de plug-in ne remplace pas la classe cible et n'en est pas une instance. Vous avez juste des méthodes before{method}, around{method}, after{method}qui sont exécutées au moment opportun en ce qui concerne {méthode} sur la classe cible.

Comme les plugins ne remplacent pas la classe cible, un nombre quelconque de plugins peuvent être actifs sur une classe simultanément. Magento les exécute les unes après les autres en fonction du paramètre sortOrder de votre code XML.

De ce fait, les plugins sont beaucoup plus flexibles que les préférences. Vous devez utiliser des plugins dans la mesure du possible et éviter les préférences pour la réécriture des classes sauf en cas d'absolue nécessité.

Vous pouvez en savoir plus sur le fonctionnement des plugins et comment les utiliser dans la documentation officielle .


La préférence n’est pas équivalente à la réécriture de classe. C'est un moyen de fournir une implémentation par défaut pour les interfaces.
KAndy

1
@KAndy C'est peut-être l'objectif recherché de base, mais un effet secondaire de cela est qu'ils fonctionnent également pour la substitution de classe. Sémantiquement, ils sont les mêmes. Yogesh a parlé de la réécriture de classe via préférences, et vous demande également de suivre l'exercice de base sur lequel il travaillait.
Ryan Hoerr

12

En mots simples

La préférence est utilisée pour passer outre à la classe

Le plugin est utilisé pour ajouter des fonctionnalités avant, après et autour des méthodes.

Pour votre exemple:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

Chaque fois que le code demande ListProduct, la préférence dit que

Hey, utilisez Vendor\MyModule\Block\Product\ListProduct au lieu de Magento\Catalog\Block\Product\ListProduct

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

Chaque fois que le code demande à getPrice (), le plugin dit que

Hey utiliser ma getPrice() méthode avant, après et autour de votre getPrice() méthode


1

En bref :

La préférence est utilisée pour spécifier l'implémentation par défaut d'une interface.

Plugin (Interceptor) est utilisé pour étendre le comportement d'une méthode publique d'une autre classe.

En détail :

Préférence: Si plusieurs classes implémentent une interface, il est important de spécifier la classe par défaut de toutes les classes implémentées. Cela se fait via le noeud de préférence du fichier d'injection de dépendance (di.xml).

Exemple :

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

Ce mappage est inséré app/etc/di.xml, de sorte que le gestionnaire d'objets injecte la Magento\Core\Model\Urlclasse d'implémentation partout où une demande existe Magento\Core\Model\UrlInterfacedans l'étendue globale.

Plugin (intercepteur):

Disons qu'une classe Aa une méthode methodAqui nécessite une fonctionnalité étendue. Ensuite, ceci est réalisé via des plugins en créant une classe APluginsans modifier la classe d'origine A. La classe APlugina des méthodes qui s'exécutent avant, après ou autour de la méthode requise.

Exemple :

<config>
    <type name="Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock">
        <plugin name="showOutOfStockValueChanged" type="Magento\Catalog\Model\Plugin\ShowOutOfStockConfig"/>
    </type>
</config>

Ce mappage se trouve dans app / etc / di.xml. Une / quelques-unes des Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockméthodes de classe sont exécutées avant / après / autour des Magento\Catalog\Model\Plugin\ShowOutOfStockConfigméthodes de classe .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.