¿Cuándo enviar eventos en un módulo personalizado?

14

Esta es una pregunta con respecto a Magento 1 y Magento 2.

Entiendo que, como buena práctica, se alienta a los desarrolladores de módulos de terceros a enviar eventos en su módulo personalizado para que sea más fácil trabajar con otros módulos.

Me gustaría saber:

  • ¿Dónde debe un desarrollador enviar eventos en un módulo personalizado?
  • ¿Hay algún lugar recomendado para enviar eventos? Por ejemplo, controladores, modelos, bloques, ayudantes, observadores?
  • ¿Cómo los eventos de envío afectan el rendimiento?
Raphael en Digital Pianism
fuente
¡si! buena pregunta. Alguien por favor responda esta pregunta. Será muy útil para desarrolladores de extensiones de terceros, así como para proyectos personalizados.
mapaladiya

Respuestas:

10

No vas a encontrar una respuesta buena, clara y determinista aquí. En general, debe enviar eventos en su módulo donde usted y sus usuarios los necesiten; si no puede pensar en algún lugar donde podrían ser necesarios, no necesita enviarlos. Magento mismo emite tantos eventos en tantos lugares diferentes (envío previo / posterior del controlador, cualquier operación sin importancia, etc.) que su módulo ya enviará una serie de eventos útiles sin que usted haga nada.

Dado que eso no es satisfactorio, querrá que su módulo envíe un evento cuando haya alguna acción que su módulo tome y que sus usuarios quieran agregar elementos, eliminar elementos, cambiar o realizar una acción independiente independientemente de la acción original. Por ejemplo, Magento tiene un visitor_initevento que no forma parte de su conjunto estándar de eventos generados automáticamente. Este evento permite a los programadores modificar el objeto del visitante antes de que Magento registre datos. Los desarrolladores de módulos originales no sabían de manera deterministaaquí era donde se necesitaba agregar un evento, probablemente provenía de solicitudes de funciones y / o entrevistas con usuarios del sistema. Sepa lo que quieren sus usuarios, y si no es posible / práctico construir una UI / UX para permitirles hacerlo a través del administrador, agregue un enlace de eventos para que otro programador pueda hacerlo por ellos.

Menos sexualmente, agregar eventos también puede ser una forma económica de permitir que los desarrolladores (ya sea sus usuarios o incluso su equipo) agreguen algunas funcionalidades a un código retorcido que todos temen tocar. Coloque su dispatchEventllamada en el medio del código, conéctela y podrá agregar su funcionalidad sin alterar el código en el alcance original. [Editor: También deberías refactorizar ese horrible código en algún momento]

En cuanto al rendimiento, agregar un evento para despachar dependerá de dónde lo agregue. Cuando llama a un dispatchevento, Magento necesita hacer algunas llamadas PHP adicionales, consultar la configuración de cualquier observador configurado y luego llamar a los observadores. Hecho una vez, esta es una adición económica en el alcance de un envío estándar de Magento. Sin embargo, hecho repetidamente (por ejemplo, antes de cada renderizado de bloque) esto puede sumar. No hay una buena regla general aquí, como siempre, la respuesta correcta es el perfil.

Finalmente, w / r / t Magento 2, todavía es demasiado pronto para decirlo. Todo lo anterior aún se aplica, sin embargo, el sistema de complemento agrega algunas arrugas. Los complementos son, desde un punto de vista, una forma de crear un comportamiento similar a un evento para cualquier llamada a un método público en Magento. En teoría, si está diseñando sus clases correctamente, nunca debería necesitar un evento. Sin embargo, en la práctica, colocar un evento en un código de método privado o protegido será una solución tentadora para los desarrolladores de Magento cuando la alternativa es un largo proceso de refactorización. Además, crear un evento con un nombre específico a menudo puede crear una experiencia más amigable para los desarrolladores que usan su módulo.

¡Espero que ayude!

Alan Storm
fuente
9

Para Magento 1, los buenos momentos para lanzar eventos son antes y después de todas las operaciones CRUD y antes y después del renderizado. Muchos de estos ya son proporcionados por las clases abstractas en el núcleo, por lo que en la práctica no se necesitan muchos eventos de terceros.

Con Magento 2 la situación es diferente. Debido a que las llamadas a métodos públicos se pueden interceptar con complementos, ya no se necesitan eventos personalizados.
Al diseñar clases, en lugar de simplemente hacer públicos todos los métodos para que puedan ser interceptados, es mejor descomponer una clase grande en varias clases más pequeñas.
Cada una de las clases más pequeñas podría tener uno o dos métodos públicos bien interceptables y bien nombrados.

Vinaí
fuente
0

Como dijo Vinai, antes / después de las operaciones CRUD. Otro lugar importante para enviar eventos es en bloques de formulario adminhtml (si corresponde). De esa manera, puede agregar nuevos campos de entrada si ha agregado atributos / campos personalizados sin tener que volver a escribir los bloques de formulario de administración. (Esto es para Magento 1). Ver ejemplo

Erfan
fuente
0

Dentro de Magento 1, puede aprovechar los eventos a través de los eventos que se producen automáticamente. Todo lo que necesita hacer es establecer una $_eventPrefixy $_eventObjectpropiedades en sus modelos. Además, tiene eventos de controlador disparados personalizados a través de los eventos 'controller_action_predispatch_ ' . $this->getFullActionName()y 'controller_action_postdispatch_' . $this->getFullActionName()en el controlador automáticamente. Esos pueden llevarte la mayor parte del camino hasta allí.

Para Magento 2, mantenga sus métodos públicos dentro de sus clases. Esto permite que los complementos intercepten sus métodos. Si sigue esto, no tendrá que crear ningún evento personalizado.

¡Espero que esto ayude!

Ryan Street
fuente