Funcionamiento de Plugins (Interceptors) en Magento2

En Magento2 Un Plugin o Interceptor es una clase que nos permite manipular el núcleo sin necesidad de tocar ninguno de sus ficheros.

Para poder realizar esta tarea el Plugin utiliza los siguientes prefijos en los métodos que necesita modificar:

  • before: es ejecutado antes que el método observado sea llamado.
  • after: ejecuta el código después de que el método observado sea llamado.
  • around: nos permitirá ejecutar código antes y después.

Estos métodos nos permitirán sustituir o manipular el comportamiento por defecto de métodos públicos de cualquier clase o interfaz.

Por lo que un Plugin cambiará el comportamiento de una clase o método pero nunca cambiará la clase en si misma.

Este proceso al que llamaremos interception disminuye los conflictos entre extensiones que cambien el comportamiento de la misma clase o método.

Magento llamará a estos interceptores secuencialmente dependiendo del orden que le tenga asignado.

Los Plugins no pueden ser utilizados en:

  • métodos final()
  • clases final
  • métodos que no sean públicos
  • métodos estáticos
  • __construct()
  • Virtual Types definidos en nuestro di.xml

Declaración del Plugin

Lo declararemos en el fichero etc/di.xml (dependecy injection) que es el fichero que controla dependencias en Magento2.

  • type name: Será la clase o interfaz que nuestro Plugin va a observar.
  • plugin name: Es un nombre aleatorio que identificará a nuestro Plugin.
  • plugin type: Es el nombre de la clase del Plugin o su tipo virtual (virtualType).
  • sortOrder: Orden en el que se ejecutará en caso de que existan otros Plugins.
  • disabled: desactiva o activa el Plugin.

Definiendo nuestro Plugin

Vamos a incluir el prefijo after al método setCustomerDataAsLoggedIn() de nuestra clase session en la libreria Customer de Magento2.

Nuestro método sera ejecutado después de se ejecutado setCustomerDataAsLoggedIn() por lo que es necesario que tenga un valor de retorno.

Todos los métodos after tienen que acceder a todos los argumentos del método observado.

En caso de que el Plugin definido en nuestro fichero de dependencias di.xml no exista, Magento2 mostrará un error y generará un reporte en var/report/

Los interceptores son generados en generated/code/

El resultado de nuestro Plugin es el siguiente:

Etiquetado

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.