Magento Event Observers: Singleton contro Model


45

Quindi Magento offre 2 modi per dichiarare un osservatore. Singleton e Model (nuova istanza) specificando il <type>tag in Magento 1.xe specificando l' sharedattributo 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>

Versione Magento 2:

<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 <type>tag è modello o oggetto, la classe verrà istanziata con Mage::getModel(). Se singletonmanca o manca, viene istanziato usando Mage::getSingleton().

Nel caso di Magento 2, if sharedis falseallora la classe viene istanziata usando $this->_observerFactory->create() (nuova istanza).
se sharedè vero viene istanziato usando $this->_observerFactory->get()(singleton).

Tra le due versioni l'idea dell'osservatore di eventi è molto simile, ma la maggior parte degli osservatori in Magento 1 sono usati come singoli, perché typemanca il tag e in Magento 2 la maggior parte (penso tutto) degli osservatori shared="false".

Sono perplesso. Quando dovrei usare i singoli e quando dovrei usare nuove istanze per gli osservatori?
La versione di Magento (1 o 2) non è importante qui.
Un semplice caso d'uso farebbe per ogni approccio (nuova istanza o singleton)


Anche alle prese con esso. Anche se non è necessario utilizzare typeaffatto l' attributo, in modo che di solito lo salti ora.
Simon,

@Simon Di solito lo salto. Nessun typetag è la stessa cosa di <type>singleton</type>. Allora, qual è la ragione per cui stiamo facendo singletons osservatori?
Marius

Questa è davvero una buona domanda. Ecco perché l'ho votato. Volevo solo sottolineare che puoi anche saltare completamente.
Simon,

Risposte:


36

C'è solo un caso d'uso, in cui singleton per gli osservatori avrebbe senso. Quello è quando osservi due eventi che dipendono l'uno dall'altro e vuoi ottenere qualcosa durante il primo, ma lo elabori durante il secondo evento. Puoi 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 accade quasi mai, ma magento 1 e 2 usano di default shared = true

Il probabile motivo per cui singleton è predefinito in magento: micro-ottimizzazione! Qualcuno pensava che avrebbe risparmiato così tanto tempo a non dover creare gli oggetti ancora e ancora. Può essere vero per alcuni eventi che vengono chiamati alcune centinaia di volte durante una richiesta, può anche essere ragionevole farlo come predefinito per i casi di cattivo utilizzo degli eventi.


5
Le cuciture sono una spiegazione abbastanza buona. . E ora che lei ha citato, esso mi ha colpito in testa ... un caso d'uso reale per i single: quando si desidera osservare _save_beforee _save_aftere le azioni su Salva dopo dipendere da qualcosa _save_before. Duh! come potrei averlo perso?
Marius

"che è, perché magento2 usa di default shared = false" Questo è sbagliato. Magento 2 utilizza shared=trueper impostazione predefinita .
Mage2.PRO,


grazie, aggiornata la risposta
Flyingmana

1

Magento usa di default il singleton in modo da risparmiare risorse all'interno della scatola. due esigenze operative di processo simultaneo modello in quanto hanno bisogno di memorizzare e conservare i dati individualmente. in singleton l'oggetto diventa volatile non appena vengono caricati nuovi dati.

In anticipo magento 2.0 utilizza oggetti condivisi da utilizzare. Magento 2.0 ha distruttori ben scritti che mantengono pulita la memoria non appena il lavoro è fatto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.