Magento事件观察者:Singleton与模型


45

因此,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属性,但是我现在通常会跳过它。
西蒙(Simon)

@Simon我通常会跳过它。没有type标签与相同<type>singleton</type>。那么,我们使观察者单身的原因是什么?
马吕斯

这确实是一个好问题。这就是为什么我支持它。只是想指出,您也可以完全跳过它。
西蒙

Answers:


36

只有一个用例,观察者的单例才有意义。那就是当您观察到两个相互依赖的事件,并且您想要在第一个事件中得到某些东西,而在第二个事件中对其进行处理时。您也可以在此处使用注册表,但这将更加全局,因此单例和受保护的类变量是一个很好的解决方案。

实际上,这几乎是从未发生过,但是默认情况下,Magento 1和2会使用shared = true

在magento中默认单例的可能原因是:微优化!有人认为这样可以节省很多时间,而不必一次又一次地创建对象。对于某些在请求过程中被调用了数百次的事件,可能是正确的;对于错误使用事件的情况,将它作为默认值甚至是合理的。


5
接缝就像一个很好的解释。。既然您已经提到它,它就让我印象深刻……一个单例的真正用例:当您要观察时_save_before_save_after以及之后的保存操作取决于_save_before。!我怎么会错过呢?
马吕斯

“这就是为什么magento2默认使用shared = false”这是错误的。Magento 2 默认使用shared=true
Mage2.PRO 2015年


thx,更新了答案
Flyingmana 2015年

1

Magento默认使用单例,因此可以节省资源。两个并发的流程操作需求模型,因为它们需要分别存储和保存数据。在单例中,一旦加载了新数据,对象就会变得易失。

magento 2.0预先使用共享对象进行利用。.magento 2.0具有编写良好的析构函数,可在完成工作后立即清理内存!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.