Ordenación de Plugins en Magento

por David Abad
Ordenación plugins Magento

Uno de los cambios más relevantes incluido en la segunda versión de Magento fue la introducción del concepto de plugins. Estos plugins permiten definir lógica que debe ser lanzada antes y/o después de una función concreta de nuestro proyecto, evitando así la sobreescritura del código de clases completas y todos los problemas que ello conlleva.

Magento permite definir múltiples plugins para una misma lógica. Es muy importante aprender cómo funciona el criterio de ordenación de estos plugins, para poder definir el orden correcto en que deben ser lanzados.

Tipos de plugin

Magento incluye diferentes tipos de plugin según el punto de la función original en el que deben ser lanzados:

  • Plugin before: Son lanzados antes de la función original y permiten modificar los parámetros de entrada.
  • Plugin after: Son lanzados después de la función original y permiten modificar el resultado devuelto. 
  • Plugin around: Son lanzados antes y/o después de la función original, permitiendo modificar tantos los parámetros de entrada como el resultado devuelto.
El flujo habitual de ejecución según el tipo de plugin es: Before –> Around –> After

Criterio de ordenación

Al definir un plugin en el fichero di.xml correspondiente, se acepta el parámetro opcional “sortOrder” pensado para controlar el orden de ejecución en caso de existir varios plugins para una misma clase.

<type name="<Clase observada>">
   <plugin name="<Nombre del plugin>" type="<Clase del plugin>" sortOrder="1" disabled="false" />
</type>

Sin embargo, el valor de “sortOrder” no funciona de la misma manera para todos los tipos de plugin:

  • Plugin before: Son lanzados según un orden incremental de “sortOrder”.
  • Plugin after: Son lanzados según un orden decremental de “sortOrder”.
  • Plugin around: La lógica definida antes de la llamada a la función original es lanzada según orden incremental de “sortOrder”, mientras que la lógica definida después de la llamada a la función original es lanzada según orden decremental.
En caso de que el parámetro “sortOrder” no esté definido o tenga el mismo valor para diferentes plugins, el factor que determinará el orden de ejecución serán las dependencias entre los módulos que definen dichos plugins. Es decir, si el módulo A es dependiente del módulo B, los plugins definidos en el módulo B serán lanzados antes.

Flujo de ejecución de plugins

Teniendo en cuenta todo lo anterior, el siguiente diagrama muestra como sería el flujo de ejecución de una serie de plugins definidos para una misma lógica:

Flujo de ejecución de plugins

Flujo de ejecución de plugins

Es importante tener en cuenta que, en caso de los plugin de tipo around, la continuidad de ejecución del resto de plugins viene condicionada a la llamada a la función original. Es decir, si un plugin around no llama a la función original, ninguno de los sucesivos plugins se lanzaría.

Déjanos tu email para recibir contenido interesante en tu bandeja de entrada, cada mes.

¡No hacemos spam!

Otros artículos