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;
}
}
la source
En mots simples
Pour votre exemple:
Chaque fois que le code demande ListProduct, la préférence dit que
Hey, utilisez
Vendor\MyModule\Block\Product\ListProduct
au lieu deMagento\Catalog\Block\Product\ListProduct
Chaque fois que le code demande à getPrice (), le plugin dit que
Hey utiliser ma
getPrice()
méthode avant, après et autour de votregetPrice()
méthodela source
En bref :
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 :
Ce mappage est inséré
app/etc/di.xml
, de sorte que le gestionnaire d'objets injecte laMagento\Core\Model\Url
classe d'implémentation partout où une demande existeMagento\Core\Model\UrlInterface
dans l'étendue globale.Plugin (intercepteur):
Disons qu'une classe
A
a une méthodemethodA
qui nécessite une fonctionnalité étendue. Ensuite, ceci est réalisé via des plugins en créant une classeAPlugin
sans modifier la classe d'origineA
. La classeAPlugin
a des méthodes qui s'exécutent avant, après ou autour de la méthode requise.Exemple :
Ce mappage se trouve dans app / etc / di.xml. Une / quelques-unes des
Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock
méthodes de classe sont exécutées avant / après / autour desMagento\Catalog\Model\Plugin\ShowOutOfStockConfig
méthodes de classe .la source