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?
magento2
module
extensions
event-observer
magento-1
Raphael en Digital Pianism
fuente
fuente
Respuestas:
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_init
evento 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
dispatchEvent
llamada 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
dispatch
evento, 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!
fuente
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.
fuente
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
fuente
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
$_eventPrefix
y$_eventObject
propiedades 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!
fuente