Reescribiendo las clases de Magento 2 vs Plugins

17

Magento 2 tiene el concepto de Complementos / Intercepción / Interceptores opuestos a Magento 1.
Estos actúan como un antes | después del evento para cada método público. Lo cual es bueno.
También puede usar el aroundcomplemento para reemplazar la funcionalidad de un método.
Pero Magento 2 todavía ofrece la posibilidad de reescribir clases más o menos de la manera M1.
Me gustaría ver algunos ejemplos donde las clases de reescritura son el camino a seguir en lugar de usar complementos.
Sé que esto es útil cuando desea cambiar el comportamiento de un método protegido central, pero ¿hay otros casos en los que se recomienda o necesita una reescritura?

Marius
fuente
1
Relacionado: magento.stackexchange.com/questions/93932/…
Robbie Averill

Respuestas:

19

La razón obvia para usar una reescritura en lugar de un complemento es cuando necesita anular un método privado, protegido o final .

Pero también considere los siguientes escenarios.

1er escenario (orden de clasificación absoluto):

Las reescrituras pueden ser útiles cuando necesita que su código se ejecute antes de los complementos . Sé que puedes hacerlo configurando el complemento sortOrder, pero no puedes estar seguro de que tu código siempre será el primero cuando alguien (no tú) vaya a instalar componentes de terceros.

2do escenario (excluir código):

Si necesita excluir o reescribir solo un fragmento de código en un método, un complemento podría ser una forma subóptima. Sé que puedes usar un aroundcomplemento y evitar llamar al proceed, pero esto podría romper otros complementos en la pila.

3er escenario (estilo de código):

Debería usar reescrituras cuando necesite reescribir un comportamiento, los complementos deben usarse para modificar la salida o ejecutar el código antes / después.

Un complemento, siempre debe ejecutar el código original para evitar romper otros módulos.

Mi conclusión:

Si puede considerar un método central como un cuadro negro con una entrada y una salida y es independiente de sus mecanismos internos, entonces un complemento podría ser la mejor opción.

Si necesita cambiar un comportamiento interno , una reescritura podría ser la mejor opción.

Phoenix128_RiccardoT
fuente
El primer escenario es ligeramente inexacto (creo que es solo la redacción) ya que se ejecuta un complemento anterior o anterior (o puede ejecutarse) antes del código del método real.
David Verholen
Sí, mi redacción no era correcta. Mi punto fue sobre el orden de clasificación relativo con el método real.
Phoenix128_RiccardoT
7

Gran pregunta, me pregunté lo mismo el otro día y esto es lo que se me ocurrió:

  • Primero, los complementos no se pueden usar para métodos finales, clases finales y clases creadas sin inyección de dependencia. Creo que es un caso muy específico, pero ese es un caso en el que no se pueden usar complementos.
  • En segundo lugar, debe tener en cuenta la definición de un complemento. Se usa para trabajar en un nivel de método, mientras que las preferencias se usan para trabajar en el nivel de toda la clase. No es obvio para todos, por lo que es bueno tenerlo en cuenta.
  • Finalmente, y creo que es lo más importante, parece que los complementos solo se pueden usar para extender el comportamiento de cualquier método público dentro de una clase de Magento . Por lo tanto, parece que no puede usar complementos con métodos protegidos / privados .

Fuente: Curso fundamental de Magento U

Raphael en Digital Pianism
fuente
2
Okay. Buenas razones. Sin embargo, no sé qué decir sobre el segundo punto. Si desea completar muchos métodos públicos de la misma clase, creo que la forma más segura es crear una sola clase que actúe como un complemento para todos ellos. (mi opinión). Dejaré esto abierto 2-3 días para ver si alguien tiene otras razones. Si no ... la marca de verificación es tuya.
Marius
@ Mario tienes toda la razón en relación con el segundo punto. Por algunas razones, pensé que tenía que crear varios archivos de plugin para cada método que deseaba pluginizar, pero creo que eso es lo que hacen los observadores, no los plugins. Eso sería genial si más personas responden para ver si hay más razones (no obvio).
Raphael en Digital Pianism
1
@marius como una adición: como los complementos deberían ser específicos del dominio, creo que debería ser al menos la mejor práctica definir solo múltiples complementos en una clase, si son una implementación de la misma característica. Con una reescritura, no tiene esta opción, ya que siempre cambia una clase completa. Así que creo que esa sería una razón para al menos tratar de evitar reescrituras
David Verholen
@DavidVerholen. Estoy totalmente de acuerdo. Pero estaba preguntando por razones para usar reescrituras en lugar de complementos.
Marius
Sí, creo que esta podría ser una razón para usar complementos, ya que puede definir clases de complementos específicos de entidades, mientras que una reescritura solo se puede hacer una vez
David Verholen