Magento 2 y su sistema de plugins

El reemplazo de las «reescritura de clases» de Magento 1

Visitas: 497

A través de archivos de configuración XML en Magento 1 se le puede indicar a la aplicación que use una clase definida por nuestro modulo en vez de coger la clase por defecto de Magento, permitiendo la rescritura de cualquier método de la clase padre. Sin embargo, este tipo de implementación tiene sus desventajas, siendo una de ellas que una clase solo puede ser reescrita por un solo modulo.

Magento 2: Plugins

La «reescritura de clases» sigue existiendo en Magento 2 pero trae a su vez el sistema de 'plugins' con la finalidad de resolver el problema de una relación 1-1 en la «reescritura de clases».

El sistema de plugins permite:

  • Escuchar a cualquier método público de una clase contralada por el Object Manager de Magento.
  • Cambiar el valor 'return' de cualquier método público de una clase.
  • Cambiar los argumentos de cualquier método público de una clase.
  • Permitir estos cambios comentados anteriormente e igualmente dejar la compatibilidad para que otros módulos actúen sobre la misma clase y el mismo método público.

El sistema de plugins, también tiene ciertas limitaciones:

  • Métodos finales.
  • Clases finales.
  • Clases que contengan al menos una calse publica final.
  • Métodos no públicos.
  • Métodos de clase.
  • Funcion __construct.
  • Clases virtuales.

'Tipos' de métodos de los plugins

El sistema de plugins de Magento 2 ofrece tres 'tipos' de métodos, que son: after, before y arround. El sistema de plugins de Magento 2 hace esto posible a través del patrón interceptor.

Los plugins en Magento 2 tienen una pequeña nomenclatura para que puedan actuar sobre el método público que queramos. En nuestro plugin debemos crear una función llamándola de esta manera:

<?php
 
public function (before | after | around)NombreDelMetodoDeLaClaseSobreLaQueActuamos($subject, $result | $proceed, $args){
 
//Code
 
}
?>

* Nota el camel case

Método after (después)

Permite actuar  después del llamado a la función pública.

Recibe como parámetros:

  • $subject: Objeto original
  • $result: Resultado del plugin anterior al nuestro o en su defecto, el método original.
<?php
 
public function afterExecute($subject, $result){
  If(
$result->canDoit){
   
//DoIt 
 
}
 }
?>

Método before (antes)

Permite actuar antes del llamado a la función pública, permite cambiar los argumentos pasados al método original.

Recibe como parámetros:

  • $subject: Objeto original

Luego todos y cada uno de los argumentos que recibe el método original, incluyendo parámetros por defecto. En el caso de tener varios argumentos, la funcion debe devolver los valores en forma de un array.

<?php
public function beforeExecute($subject, $arg1, $arg2 = true, $arg3){
 
$arg1 = ‘DoIt’;
 return [
$arg1, $arg2, $arg3];
}
?>

Método around (miéntras)

Permite actuar mientras se ejecuta el método público. Es posible cambiar por completo la funcionalidad del método público, ya que tenemos el control de incluso si el método original se ejecuta o no.

Recibe como parámetros:

  • $subject: Objeto original
  • $proceed: Function original del metodo, se le deben de pasar todos los parametros

Luego todos y cada uno de los argumentos que recibe el método original, incluyendo parámetros por defecto.

<?php
public function aroundExecute($subject, $proceed, $arg1, $arg2 = true, $arg3){
 
//$result = $proceed ($arg1, $arg2, $arg3);
 
$result = ‘My result’;
 return
$result;
}
?>

Fuentes:

Autor

Imagen de Gianni Paolo Di Falco

Programador

CAPTCHA
Esta pregunta es para comprobar si usted es un visitante humano y prevenir envíos de spam automatizado.