Pregunta

Así Magento ofrece 2 maneras de declarar en calidad de observador.Singleton y el Modelo (nueva instancia) especificando el <type> etiqueta en Magento 1.x y especificando el shared atributo en Magento 2.

Magento 1 forma de hacerlo.

<events>
    <event_name>
        <observers>
            <unique_observer_name>
                <type>model|object|singleton|null</type>
                <class>class/alias_here</class>
                <method>methdNameHere</method>
            </unique_observer_name>
        </observers>
    </event_name>
</events>

Magento 2 versión:

<event name="event_name">
    <observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>

Así, en el caso de Magento 1, si el <type> la etiqueta de modelo o el objeto, la clase será instanciado con Mage::getModel().Si es singleton o es que falta es que se crea una instancia de usar Mage::getSingleton().

En el caso de Magento 2, si shared es false a continuación, crear instancias de la clase utilizando $this->_observerFactory->create() (nueva instancia).
si shared es cierto que se crea una instancia utilizando $this->_observerFactory->get() (singleton).

Entre las dos versiones de el observador de evento idea es muy similar, pero la mayoría de los observadores en Magento 1 se utilizan como los únicos, porque el type etiqueta de falta y en Magento 2 la mayoría (creo que todos) de los observadores han shared="false".

Estoy perplejo. Cuando debo utilizar singleton y cuando debo usar nuevas instancias para que los observadores?
Versión Magento (1 o 2) no es importante aquí.
Un caso de uso sencillo para cada enfoque (nueva instancia o singleton)

¿Fue útil?

Solución

Sólo hay un caso de uso, donde singleton para los observadores tendría sentido.Eso es cuando usted observar dos eventos que dependen unos de otros y quieres conseguir algo durante el primero, pero el proceso durante el segundo caso.Usted podría también utilizar el registro aquí, pero que sería algo mucho más global, por lo singleton y protegida variable de clase es una buena solución.

En realidad, esto es, casi nunca pasa, pero de magento 1 y 2 de uso por parte compartida por defecto=true

La que probablemente sea la razón por la que singleton es el valor por defecto en magento:micro-optimización!Alguien pensó que iba a guardar sooo mucho tiempo para que no tengan que crear los objetos una y otra vez.Puede ser cierto para algunos de los eventos que se llaman un par de cientos de veces durante una solicitud, puede ser incluso es razonable hacerlo de forma predeterminada para los casos de mal uso de eventos.

Otros consejos

Magento por defecto usa el singleton por lo que ahorra los recursos dentro de la caja.dos proceso concurrente necesidades operativas de cada modelo, ya que necesitan almacenar y mantener los datos de forma individual.en singleton el objeto de obtener volátiles tan pronto como los nuevos datos se han cargado.

Upfrontly magento 2.0 utiliza objetos compartidos a utilizar..magento 2.0 tiene muy bien escrito destructores que mantiene la limpieza de la memoria tan pronto como el trabajo hecho!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top