Utilicé el complemento y la preferencia en el tutorial de magento2 y ambos funcionan bien, pero ¿cuál es la diferencia básica entre ellos?
Código para el complemento:
1.1) Agregue una declaración de complemento en di.xml:
<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>
1.2) Crear una clase de complemento:
<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}
Código de preferencia:
2.1) Crear una declaración de preferencia:
<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />
2.2) Crear una nueva clase de producto:
<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}
fuente

En palabras simples
Por como su ejemplo:
Cada vez que el código solicita ListProduct, la preferencia dice que
Hey, usa en
Vendor\MyModule\Block\Product\ListProductlugar deMagento\Catalog\Block\Product\ListProductCada vez que el código solicita getPrice (), el complemento dice que
Hey, usa mi
getPrice()método antes, después y alrededor de tugetPrice()métodofuente
En breve :
En detalle :
Preferencia: si hay más de una clase que implementa una interfaz, entonces es importante especificar la predeterminada de todas las clases implementadas. Esto se realiza a través del nodo de preferencia en el archivo de inyección de dependencia (di.xml).
Ejemplo:
Esta asignación está activada
app/etc/di.xml, por lo que el administrador de objetos inyecta laMagento\Core\Model\Urlclase de implementación siempre que haya una solicitud para elMagento\Core\Model\UrlInterfacealcance global.Plugin (interceptor):
Digamos, una clase
Atiene un métodomethodAque necesita una funcionalidad extendida. Luego, esto se logra a través de complementos creando una claseAPluginsin modificar la clase originalA. La claseAPlugintiene métodos que se ejecutan antes, después o alrededor del método requerido.Ejemplo:
Esta asignación se encuentra en la aplicación / etc / di.xml. Uno / pocos de los
Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockmétodos de clase se ejecutan antes / después / alrededor de losMagento\Catalog\Model\Plugin\ShowOutOfStockConfigmétodos de clase .fuente