Solución:
Una preferencia es equivalente a la reescritura de clases desde Magento 1. Es equivalente a decir, “Siempre que el código solicite ClassA
, darles MyClassB
en lugar de.” MyClassB
Se espera que sea una implementación completa de ClassA
, además de cualquier comportamiento que agregue o modifique en la parte superior.
Al igual que en Magento 1, solo una preferencia (reescritura) puede estar activa para una clase a la vez, a menos que las encadene manualmente (de modo que MyClassB
se extiende OtherClassB
, y OtherClassB
se extiende ClassA
).
Un complemento le permite ejecutar código antes, alrededor o después de los métodos de la clase a la que se está conectando. Su clase de complemento no reemplaza a la clase de destino y no es una instancia de ella. Solo tienes métodos before{method}
, around{method}
, after{method}
que se ejecutan en el momento apropiado con respecto a {método} en la clase de destino.
Dado que los complementos no reemplazan la clase de destino, cualquier número de complementos puede estar activo en una clase simultáneamente. Magento simplemente los ejecuta uno tras otro según el parámetro sortOrder en su XML.
Por eso, los complementos son mucho más flexibles que las preferencias. Debe usar complementos siempre que sea posible y evitar preferencias para reescribir clases a menos que sea absolutamente necesario.
Puede leer más sobre cómo funcionan los complementos y cómo usarlos en la documentación oficial.
En palabras simples
La preferencia se usa para invalidar la clase
El complemento se utiliza para agregar funcionalidad antes, después y alrededor de los métodos.
Para como su ejemplo:
<preference for="MagentoCatalogBlockProductListProduct" type="VendorMyModuleBlockProductListProduct" />
Siempre que el código solicite ListProduct, preferencia dijo que
Hey, usa VendorMyModuleBlockProductListProduct
en lugar de MagentoCatalogBlockProductListProduct
<type name="MagentoCatalogModelProduct">
<plugin name="magento-catalog-product-plugin" type="TrainingTestModelProduct" sortOrder="10"/>
</type>
Siempre que el código solicite getPrice (), plugin dijo que
Hey usa mi getPrice()
método antes, después y alrededor de su getPrice()
método