Magento Evento Observadores:Singleton versus Modelo
-
12-12-2019 - |
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)
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!