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\ListProduct
lugar deMagento\Catalog\Block\Product\ListProduct
Cada 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\Url
clase de implementación siempre que haya una solicitud para elMagento\Core\Model\UrlInterface
alcance global.Plugin (interceptor):
Digamos, una clase
A
tiene un métodomethodA
que necesita una funcionalidad extendida. Luego, esto se logra a través de complementos creando una claseAPlugin
sin modificar la clase originalA
. La claseAPlugin
tiene 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\ShowOutOfStock
métodos de clase se ejecutan antes / después / alrededor de losMagento\Catalog\Model\Plugin\ShowOutOfStockConfig
métodos de clase .fuente