Таким образом, 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, если shared
is, false
то экземпляр класса создается с использованием $this->_observerFactory->create()
(новый экземпляр).
Если shared
true, то создается с использованием $this->_observerFactory->get()
(singleton).
Между двумя версиями идея наблюдателя событий очень похожа, но большинство наблюдателей в Magento 1 используются как синглтоны, потому что type
тег отсутствует, а в Magento 2 большинство (я думаю, что все) наблюдателей имеют shared="false"
.
Я озадачен Когда я должен использовать синглтоны и когда я должен использовать новые экземпляры для наблюдателей?
Версия Magento (1 или 2) здесь не важна.
Простой вариант использования подойдет для каждого подхода (новый экземпляр или одиночный)
type
тега это то же самое, что и <type>singleton</type>
. Так в чем же причина того, что мы делаем наблюдателей синглетонами?
type
атрибут вообще не обязательно , поэтому я обычно его пропускаю.