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 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>
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á singleton
ou está faltando, é instanciado usando Mage::getSingleton()
.
No caso do Magento 2, se shared
for false
, a classe é instanciada usando $this->_observerFactory->create()
(nova instância).
se shared
for 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 type
tag 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)
type
atributo, de modo que normalmente eu o pulo agora.type
tag é a mesma coisa que<type>singleton</type>
. Então, por que estamos tornando os observadores singletons?Respostas:
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.
fonte
_save_before
e_save_after
e as ações de salvar após depender de algo_save_before
. Duh! como eu poderia ter perdido?shared=true
por padrão .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!
fonte