hace 2 años
En este artículo, te guiaremos a través del proceso de creación de un evento en Magento 2. Los eventos son una herramienta poderosa que permite a los desarrolladores extender y modificar el comportamiento de Magento 2 sin necesidad de tocar el código central. Aprender a crear y utilizar eventos es esencial para cualquier desarrollador de Magento 2 que busque personalizar su tienda online de forma eficiente y mantenible.

¿Qué son los eventos en Magento 2?
Los eventos en Magento 2 son esencialmente puntos de intercepción en el flujo de ejecución del código. Cuando un evento es despachado, Magento notifica a todos los observadores registrados para ese evento, permitiéndoles ejecutar su propio código en respuesta. Esto proporciona un mecanismo flexible y desacoplado para modificar y extender la funcionalidad del sistema.
Comprendiendo el concepto de Despacho y Observación de Eventos
El corazón del sistema de eventos en Magento 2 reside en la interacción entre el despacho de un evento y la observación de ese evento. Imagina un evento como un anuncio que se hace en un sistema. Cuando algo significativo ocurre (por ejemplo, un producto se guarda, un cliente se registra), Magento 'anuncia' este evento. Los observadores son como 'oyentes' que están atentos a anuncios específicos. Cuando un observador escucha un evento al que está suscrito, entra en acción y ejecuta el código que tiene definido.
Áreas de Configuración de Eventos en Magento 2
Magento 2 utiliza el concepto de áreas para gestionar diferentes partes de la tienda. Las áreas principales son:
- Frontend: La parte visible para los clientes, la tienda online en sí.
- Adminhtml: El panel de administración, donde se gestiona la tienda.
- Global: Configuración que se aplica tanto al frontend como al adminhtml.
La configuración de los eventos se puede definir en archivos `events.xml` ubicados en diferentes carpetas `etc/` dentro de los módulos. La ubicación del archivo `events.xml` determina en qué área se activarán los observadores:
- `etc/events.xml` (Área Global): Eventos definidos aquí se ejecutarán tanto en el frontend como en el adminhtml.
- `etc/frontend/events.xml` (Área Frontend): Eventos específicos para la tienda online (frontend).
- `etc/adminhtml/events.xml` (Área Adminhtml): Eventos específicos para el panel de administración.
Pasos para Crear un Evento en Magento 2
Vamos a crear un ejemplo sencillo donde interceptaremos un evento para mostrar un texto personalizado en el frontend de Magento 2.
Paso 1: Despachar el Evento
El primer paso es despachar el evento desde el código donde queremos que se produzca la intercepción. En nuestro ejemplo, modificaremos un controlador para despachar un evento personalizado.

Archivo: `app/code/Mageplaza/HelloWorld/Controller/Index/Test.php`
<?php namespace Mageplaza\HelloWorld\Controller\Index; class Test extends \Magento\Framework\App\Action\Action { public function execute() { $textDisplay = new \Magento\Framework\DataObject(['text' => 'Mageplaza']); $this->_eventManager->dispatch( 'mageplaza_helloworld_display_text', ['mp_text' => $textDisplay] ); echo $textDisplay->getText(); exit; } } En este código, utilizamos el `EventManager` de Magento para despachar el evento llamado `mageplaza_helloworld_display_text`. El método `dispatch()` recibe dos argumentos:
- El nombre único del evento (`mageplaza_helloworld_display_text`).
- Un array de datos que se pasarán a los observadores. En este caso, pasamos un objeto `DataObject` con el texto 'Mageplaza' en la clave 'text', y lo referenciamos como 'mp_text' dentro del array de datos del evento.
Paso 2: Crear el archivo `events.xml`
Ahora, necesitamos definir nuestro observador para el evento que acabamos de despachar. Crearemos el archivo `events.xml` en la carpeta `etc/frontend/` de nuestro módulo, ya que queremos que este evento se observe en el frontend.
Archivo: `app/code/Mageplaza/HelloWorld/etc/frontend/events.xml`
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="mageplaza_helloworld_display_text"> <observer name="mp_display_text" instance="Mageplaza\HelloWorld\Observer\ChangeDisplayText" /> </event> </config> Dentro del elemento `
- `name`: Un nombre único para este observador dentro de este evento (`mp_display_text`). Se utiliza para identificar este observador si hay otros observadores para el mismo evento.
- `instance`: La clase PHP que se ejecutará cuando se despache este evento (`Mageplaza\HelloWorld\Observer\ChangeDisplayText`). Magento instanciará esta clase y ejecutará su método `execute()`.
Al colocar este archivo `events.xml` en la carpeta `frontend`, Magento sabe que debe ejecutar la clase `Mageplaza\HelloWorld\Observer\ChangeDisplayText` cada vez que se despache el evento `mageplaza_helloworld_display_text` en el área del frontend. Si despacháramos este mismo evento en el área de administración, este observador no se ejecutaría (a menos que también lo definamos en `etc/adminhtml/events.xml` o `etc/events.xml`).
Paso 3: Crear la Clase Observadora
Ahora, crearemos la clase observadora que definimos en el archivo `events.xml`. Esta clase implementará la interfaz `ObserverInterface` y contendrá la lógica que queremos ejecutar cuando se active el evento.
Archivo: `app/code/Mageplaza/HelloWorld/Observer/ChangeDisplayText.php`
<?php namespace Mageplaza\HelloWorld\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Event\Observer; class ChangeDisplayText implements ObserverInterface { public function execute(Observer $observer) { $displayText = $observer->getData('mp_text'); echo $displayText->getText() . " - Event </br>"; $displayText->setText('Evento ejecutado con éxito.'); return $this; } } Esta clase `ChangeDisplayText` implementa la interfaz `ObserverInterface`, lo que obliga a definir el método `execute()`. Este método `execute()` se ejecutará automáticamente cuando se despache el evento `mageplaza_helloworld_display_text`. Dentro del método `execute()`, recibimos una instancia de `\Magento\Framework\Event\Observer` como argumento `$observer`. Podemos acceder a los datos que se pasaron al evento utilizando `$observer->getData('nombre_del_dato')`. En nuestro caso, obtenemos el objeto `DataObject` que pasamos con la clave 'mp_text' y accedemos a su texto utilizando `$displayText->getText()`. Luego, modificamos el texto del objeto `DataObject` y devolvemos `$this`.

Paso 4: Limpiar la caché y verificar el resultado
Finalmente, es crucial limpiar la caché de Magento para que los cambios en la configuración de eventos se apliquen. Puedes hacerlo desde el panel de administración de Magento o utilizando la línea de comandos: `php bin/magento cache:clean`.
Después de limpiar la caché, visita la URL del controlador que modificamos (`/helloworld/index/test` si estás utilizando el módulo 'HelloWorld' de Mageplaza). Deberías ver en la pantalla el texto original 'Mageplaza' seguido de ' - Event ' y después de actualizar la página, solo deberías ver 'Evento ejecutado con éxito.'. Esto confirma que nuestro observador se ejecutó correctamente y modificó los datos del evento.
Preguntas Frecuentes sobre Eventos en Magento 2
- ¿Por qué usar eventos en Magento 2?
- Los eventos permiten extender la funcionalidad de Magento 2 de forma desacoplada. Esto significa que puedes modificar el comportamiento del sistema sin modificar el código central, lo que facilita las actualizaciones y el mantenimiento.
- ¿Cuántos observadores puede tener un evento?
- Un evento puede tener múltiples observadores. Magento ejecutará todos los observadores registrados para un evento en el orden en que se definen en el archivo `events.xml`.
- ¿Puedo cancelar la ejecución de un evento desde un observador?
- Sí, en algunos casos es posible cancelar la ejecución de un evento o modificar su flujo desde un observador, dependiendo del tipo de evento y cómo esté implementado.
- ¿Dónde debo colocar mi archivo `events.xml`?
- Depende del área donde quieras que se observen los eventos. Usa `etc/frontend/events.xml` para el frontend, `etc/adminhtml/events.xml` para el adminhtml, y `etc/events.xml` para ambos.
Crear eventos en Magento 2 es una habilidad fundamental para cualquier desarrollador de Magento 2. Dominar este sistema te permitirá crear extensiones más robustas, personalizables y fáciles de mantener. Experimenta con diferentes eventos y observadores para explorar todo el potencial que ofrecen.
