Таким образом, Magento предлагает 2 способа объявления наблюдателя. Singleton и Model (новый экземпляр), указав <type>тег в Magento 1.x и указав sharedатрибут в Magento 2.
Magento 1 способ сделать это.
<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:
<event name="event_name">
<observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>
Так, в случае Magento 1, если <type>тег является моделью или объектом, экземпляр класса будет создан с помощью Mage::getModel(). Если оно singletonили оно отсутствует, то оно создается с использованием Mage::getSingleton().
В случае Magento 2, если sharedis, falseто экземпляр класса создается с использованием $this->_observerFactory->create() (новый экземпляр).
Если sharedtrue, то создается с использованием $this->_observerFactory->get()(singleton).
Между двумя версиями идея наблюдателя событий очень похожа, но большинство наблюдателей в Magento 1 используются как синглтоны, потому что typeтег отсутствует, а в Magento 2 большинство (я думаю, что все) наблюдателей имеют shared="false".
Я озадачен Когда я должен использовать синглтоны и когда я должен использовать новые экземпляры для наблюдателей?
Версия Magento (1 или 2) здесь не важна.
Простой вариант использования подойдет для каждого подхода (новый экземпляр или одиночный)
typeтега это то же самое, что и <type>singleton</type>. Так в чем же причина того, что мы делаем наблюдателей синглетонами?
typeатрибут вообще не обязательно , поэтому я обычно его пропускаю.