Eu usei o plugin e a preferência no tutorial magento2 e ambos estão funcionando bem, mas qual é a diferença básica entre eles.
Código para o plugin:
1.1) Adicione uma declaração de plug-in no di.xml:
<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>
1.2) Crie uma classe de plug-in:
<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}
Código de preferência:
2.1) Crie uma declaração de preferência:
<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />
2.2) Crie uma nova classe de produto:
<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}
fonte
Em palavras simples
Para Como seu exemplo:
Sempre que o código solicita o ListProduct, a preferência diz que
Ei, use em
Vendor\MyModule\Block\Product\ListProduct
vez deMagento\Catalog\Block\Product\ListProduct
Sempre que o código pede getPrice (), o plug-in dizia que
Ei, use meu
getPrice()
método antes, depois e ao redor do seugetPrice()
métodofonte
Em resumo :
Em detalhe :
Preferência: se houver mais de uma classe que implementa uma interface, é importante especificar a padrão de todas as classes implementadas. Isso é feito através do nó de preferência no arquivo de injeção de dependência (di.xml).
Exemplo:
Como está mapeado
app/etc/di.xml
, o gerenciador de objetos injeta aMagento\Core\Model\Url
classe de implementação sempre que houver uma solicitaçãoMagento\Core\Model\UrlInterface
no escopo global.Plugin (Interceptor):
Digamos, uma classe
A
tem um métodomethodA
que precisa de uma funcionalidade estendida. Em seguida, isso é alcançado por meio de plug-ins criando classeAPlugin
sem modificar a classe originalA
. A classeAPlugin
possui métodos que são executados antes, depois ou ao redor do método necessário.Exemplo:
Esse mapeamento está no aplicativo / etc / di.xml. Um / poucos dos
Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock
métodos da classe são executados antes / depois / ao redor dosMagento\Catalog\Model\Plugin\ShowOutOfStockConfig
métodos da classe .fonte