Tak więc Magento oferuje 2 sposoby zadeklarowania obserwatora. Singleton i Model (nowa instancja), określając <type>znacznik w Magento 1.x i określając sharedatrybut w Magento 2.
Magento 1 sposób na zrobienie tego.
<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>
Wersja Magento 2:
<event name="event_name">
<observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>
Tak więc w przypadku Magento 1, jeśli <type>znacznik jest modelem lub obiektem, klasa zostanie utworzona za pomocą instancji Mage::getModel(). Jeśli go singletonbrakuje lub jest brakowany, jest tworzony za pomocą instancji Mage::getSingleton().
W przypadku Magento 2, jeśli sharedtak, falseto instancja klasy jest tworzona przy użyciu $this->_observerFactory->create() (nowej instancji).
jeśli sharedjest prawdą, tworzona jest instancja za pomocą $this->_observerFactory->get()(singleton).
Pomiędzy dwiema wersjami idea obserwatora zdarzeń jest bardzo podobna, ale większość obserwatorów w Magento 1 jest wykorzystywana jako singletony, ponieważ typebrakuje znacznika, aw Magento 2 większość (myślę, że wszyscy) mają shared="false".
Jestem zdziwiony. Kiedy powinienem używać singletonów i kiedy powinienem używać nowych instancji dla obserwatorów?
Wersja Magento (1 lub 2) nie jest tutaj ważna.
Dla każdego podejścia wystarczyłby prosty przypadek użycia (nowa instancja lub singleton)
typetag nie jest tym samym, co <type>singleton</type>. Jaki jest zatem powód, dla którego obserwatorzy stają się singletonami?
typeatrybutu, dlatego zwykle teraz go pomijam.