因此 Magento 提供了两种声明观察者的方法。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 来说,如果 sharedfalse 然后使用实例化该类 $this->_observerFactory->create() (新实例)。
如果 shared 是真的,它是使用实例化的 $this->_observerFactory->get() (单例)。

这两个版本之间事件观察者的思想非常相似,但是 Magento 1 中的大多数观察者都是作为单例使用的,因为 type 标签丢失,在 Magento 2 中大多数(我认为所有)观察者都有 shared="false".

我很困惑。 我什么时候应该使用单例,什么时候应该为观察者使用新实例?
Magento 版本(1 或 2)在这里并不重要。
每种方法都可以使用一个简单的用例(新实例或单例)

有帮助吗?

解决方案

只有一种用例,对于观察者来说单例是有意义的。当您观察两个相互依赖的事件时,您希望在第一个事件期间获取某些内容,但在第二个事件期间处理它。您也可以在这里使用注册表,但这将是更加全局的东西,因此单例和受保护的类变量是一个很好的解决方案。

实际上这几乎从未发生过,但 magento 1 和 2 默认使用shared=true

magento中默认单例的可能原因:微观优化!有人认为不需要一次又一次地创建对象会节省很多时间。对于在请求期间被调用数百次的某些事件可能是正确的,对于事件使用不当的情况,将其作为默认值甚至可能是合理的。

其他提示

Magento 默认情况下使用单例,因此可以节省框内的资源。两个并发进程操作需要模型,因为它们需要单独存储和保存数据。在单例中,一旦加载新数据,对象就会变得不稳定。

首先,magento 2.0 使用共享对象来利用..magento 2.0 有编写得非常好的析构函数,一旦工作完成,它就会立即清理内存!

许可以下: CC-BY-SA归因
scroll top