Domanda

So Magento offre 2 modi per dichiarare un osservatore. Singleton e modello (Nuova istanza) specificando il tag <type> in Magento 1.x e specificando l'attributo shared in Magento 2.

magento 1 modo di farlo.

<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 Versione:

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

Quindi nel caso di Magento 1, se il tag <type> è modello o oggetto, la classe verrà istanziata con Mage::getModel(). Se è singleton o manca è istanziata utilizzando Mage::getSingleton().

Nel caso di Magento 2, se shared è false, quindi la classe viene istanziata utilizzando $this->_observerFactory->create() (Nuova istanza).
Se shared è vero è istanziato utilizzando $this->_observerFactory->get() (Singleton).

Tra le due versioni L'idea dell'osservatore dell'evento è molto simile, ma la maggior parte degli osservatori di Magento 1 sono usati come singletons, perché manca il tag type e in Magento 2 di più (penso che tutti) degli osservatori abbiano shared="false".

Sono perplesso. Quando dovrei usare singleton e quando dovrei usare nuove istanze per gli osservatori?
La versione magenta (1 o 2) non è importante qui.
Un semplice caso di utilizzo farebbe per ogni approccio (Nuova istanza o Singleton)

È stato utile?

Soluzione

C'è solo un usecase, dove Singleton per gli osservatori avrebbe senso.Questo è quando osservi due eventi che dipendono l'uno dall'altro e vuoi ottenere qualcosa durante il primo, ma elaborarlo durante il secondo evento.Potresti anche usare il registro qui, ma sarebbe qualcosa di ancora più globale, quindi Singleton e una variabile di classe protetta è una buona soluzione.

In realtà questo non sta quasi mai accadere, ma magento 1 e 2 uso di default condiviso= true

La ragione per cui Singleton è predefinita in Magento: Micro-ottimizzazione! Qualcuno ha pensato che sarebbe salvato così tanto tempo per non aver bisogno di creare gli oggetti ancora e ancora. Potrebbe essere vero per alcuni eventi che sono chiamati poche centinaia di volte durante una richiesta, potrebbe essere anche ragionevole farlo come predefinito per i casi di cattivo utilizzo degli eventi.

Altri suggerimenti

magento per impostazione predefinita utilizza il singleton in modo che salva le risorse all'interno della scatola.Due progetti concomitanti per il funzionamento dei processi di base del modello come hanno bisogno di archiviare e tenere singolarmente i dati.In Singleton l'oggetto viene volatile non appena sono stati caricati nuovi dati.

Uborontariamente Magento 2.0 utilizza oggetti condivisi da utilizzare .. Magento 2.0 ha distruttori molto ben scritti che mantengono la memoria di pulizia non appena il lavoro svolto!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top