Observadores de Eventos Magento: Singleton versus Model

45

Portanto, o Magento oferece 2 maneiras de declarar um observador. Singleton e Model (nova instância), especificando a <type>tag no Magento 1.xe especificando o sharedatributo no Magento 2.

Magento 1 maneira de fazê-lo.

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

Versão Magento 2:

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

Portanto, no caso do Magento 1, se a <type>tag for modelo ou objeto, a classe será instanciada Mage::getModel(). Se está singletonou está faltando, é instanciado usando Mage::getSingleton().

No caso do Magento 2, se sharedfor false, a classe é instanciada usando $this->_observerFactory->create() (nova instância).
se sharedfor verdade, é instanciado usando $this->_observerFactory->get()(singleton).

Entre as duas versões, a idéia de observador de eventos é muito semelhante, mas a maioria dos observadores no Magento 1 é usada como singletons, porque a typetag está ausente e no Magento 2 a maioria (acho que todos) dos observadores shared="false".

Estou confuso. Quando devo usar singletons e quando devo usar novas instâncias para observadores?
A versão Magento (1 ou 2) não é importante aqui.
Um caso de uso simples serviria para cada abordagem (nova instância ou singleton)

Marius
fonte
Também lutando com isso. Embora não seja necessário usar o typeatributo, de modo que normalmente eu o pulo agora.
Simon
@ Simon Eu costumo ignorá-lo. Nenhuma typetag é a mesma coisa que <type>singleton</type>. Então, por que estamos tornando os observadores singletons?
Marius
Essa é realmente uma boa pergunta. É por isso que eu votei nele. Só queria ressaltar que você também pode ignorá-lo completamente.
Simon

Respostas:

36

Existe apenas um caso de uso, onde o singleton para os observadores faria sentido. É quando você observa dois eventos que dependem um do outro e deseja obter algo durante o primeiro, mas processa-o durante o segundo evento. Você também pode usar o registro aqui, mas isso seria algo ainda mais global, portanto, o singleton e uma variável de classe protegida são uma boa solução.

Na realidade, isso quase nunca está acontecendo, mas o magento 1 e 2 usam por padrão shared = true

A provável razão pela qual o singleton é o padrão no magento: micro-otimização! Alguém pensou que economizaria tanto tempo para não precisar criar os objetos repetidamente. Pode ser verdade para alguns eventos chamados algumas centenas de vezes durante uma solicitação; pode ser até razoável fazê-lo como padrão para os casos de mau uso de eventos.

Flyingmana
fonte
5
Costuras como uma explicação boa o suficiente. . E agora que você mencionou, ele me bateu na cabeça ... um caso de uso real para singletons: quando você deseja observar _save_beforee _save_aftere as ações de salvar após depender de algo _save_before. Duh! como eu poderia ter perdido?
Marius
"e é por isso que o magento2 usa por padrão shared = false" Isso está errado. Magento 2 usa shared=truepor padrão .
Mage2.PRO
thx, atualizou a resposta
Flyingmana 14/08
1

Por padrão, o Magento usa o singleton para economizar recursos dentro da caixa. modelo de necessidades operacionais de processo simultâneo, pois precisam armazenar e reter dados individualmente. em singleton, o objeto fica volátil assim que novos dados são carregados.

Inicialmente, o magento 2.0 usa objetos compartilhados para utilizar. O magento 2.0 possui destruidores muito bem escritos, que mantêm a limpeza da memória assim que o trabalho é feito!

Vipul Dadhich -TyLabs
fonte