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 shared
atrybut 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 singleton
brakuje lub jest brakowany, jest tworzony za pomocą instancji Mage::getSingleton()
.
W przypadku Magento 2, jeśli shared
tak, false
to instancja klasy jest tworzona przy użyciu $this->_observerFactory->create()
(nowej instancji).
jeśli shared
jest 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ż type
brakuje 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)
type
tag nie jest tym samym, co <type>singleton</type>
. Jaki jest zatem powód, dla którego obserwatorzy stają się singletonami?
type
atrybutu, dlatego zwykle teraz go pomijam.