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
tag é a mesma coisa que <type>singleton</type>
. Então, por que estamos tornando os observadores singletons?
type
atributo, de modo que normalmente eu o pulo agora.