Pergunta

Assim, o Magento oferece 2 maneiras de declarar um observador.E Singleton (Modelo novo instância), especificando o <type> tag em Magento 1.x e especificando o shared atributo 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>

Magento 2 versão:

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

Assim, no caso do Magento 1, se o <type> marca é o modelo ou objeto, a classe será instanciada com Mage::getModel().Se é singleton ou de que está faltando é instanciado usando Mage::getSingleton().

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

Entre as duas versões do evento observador idéia é muito semelhante, mas a maioria dos observadores no Magento 1 são utilizados como singletons, porque o type tag está em falta e em Magento 2 mais (acho que todos) os observadores têm shared="false".

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

Foi útil?

Solução

Há apenas um caso de uso, onde o singleton para observadores faria sentido.É quando você se observar dois eventos que dependem uns dos outros e você deseja obter algo durante o primeiro, mas o processo é durante o segundo evento.Você também pode usar o registro aqui, mas que seria algo ainda mais global, de modo singleton e protegida variável de classe é uma boa solução.

Na realidade, isto é quase nunca acontecer, mas magento 1 e 2 utilizam por padrão compartilhado=true

Provavelmente, a razão pela qual singleton é padrão no magento:micro-otimização!Alguém pensou que ele iria salvar sooo muito tempo para não precisar criar os objetos novamente e novamente.Pode ser verdade para alguns eventos que são chamados de algumas centenas de vezes durante um pedido, pode ser até é razoável para fazê-lo como padrão para os casos de mau uso de eventos.

Outras dicas

O Magento utiliza, por predefinição, o singleton-de maneira que poupa recursos dentro da caixa.dois concorrentes processo operacional necessidades modelo de como eles precisam armazenar e dispor de dados individualmente.em singleton com o objeto de obter volátil assim que novos dados são carregados.

Upfrontly magento 2.0 usa compartilhado de objetos para utilizar..magento 2.0 foi muito bem escrito destruidores, que mantém a limpeza de memória assim que o trabalho feito!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top