What is event and observer in Magento 2?

Crea Eventos en Magento 2: Guía Paso a Paso

hace 2 años

Valoración: 4 (2503 votos)

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.

Is Magento still being used?
As of April 2021, Magento holds a 2.32% market share in global e-commerce platforms. Roy Rubin, the former CEO of Varien, sold a share of the company to eBay, which eventually completely acquired and then sold the company to Permira in 2015; Permira later sold it to Adobe.
Índice de Contenido

¿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.

Is Magento end of life?
Adobe Commerce, formerly known as Magento, recently announced a new Lifecycle Policy. Presently, Magento 2.4. X has taken place for Magento 2.3, and Adobe has officially announced that the support for Magento 2.3 will end in September 2022. Magento 2.4 was released in July 2020.

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:

  1. El nombre único del evento (`mageplaza_helloworld_display_text`).
  2. 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 ``, definimos un elemento `` con el atributo `name` que coincide con el nombre del evento que despachamos en el paso anterior (`mageplaza_helloworld_display_text`). Dentro del elemento ``, definimos un `` con los siguientes atributos:

  • `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`.

How to create an event in Magento 2?
, Step 1: Dispatch event. Now we want to dispatch an magento 2 event list which allow other module can change the word displayed. ... , Step 2: Create a event file: events. xml. ... , Step 3: Create Observer class. Now we will create a class to execute above event. ... , Step 4: Flush cache and check the result.

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.

Subir