因此,Magento提供了两种声明观察者的方法。通过<type>
在Magento 1.x中指定标签并shared
在Magento 2中指定属性,可以选择Singleton和Model(新实例)。
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
为,false
则使用$this->_observerFactory->create()
(新实例)实例化该类。
如果shared
为true,则使用$this->_observerFactory->get()
(单例)实例化。
在这两个版本之间,事件观察者的想法非常相似,但是Magento 1中的大多数观察者都用作单例,因为type
缺少标签,而在Magento 2中,大多数(我认为是全部)观察者都具有shared="false"
。
我很困惑 什么时候应该使用单例,什么时候应该为观察者使用新的实例?
Magento版本(1或2)在这里并不重要。
每个方法(新实例或单例)都可以使用一个简单的用例
type
标签与相同<type>singleton</type>
。那么,我们使观察者单身的原因是什么?
type
属性,但是我现在通常会跳过它。