【问题标题】:Can someone explain Singletons in Magento?有人可以解释 Magento 中的单身人士吗?
【发布时间】:2012-06-27 16:13:11
【问题描述】:

我在这里和谷歌上阅读了大量的线程,但由于某种原因,我仍然不明白单例与 Magento 的关系。例如,我创建了一个观察者来监听订单保存事件并执行一些自定义逻辑。根据我在另一个线程中收到的建议,我的班级是单身人士。我怎么知道这是正确的?会不会是单例以外的东西?

 <frontend>
    <events>
        <checkout_type_onepage_save_order_after>
            <observers>
                <reducesetinventory_save_order_observer>
                    <class>MyModule_ReduceSetInventory_Model_Observer</class>
                    <method>checkout_type_onepage_save_order_after</method>
                    <type>singleton</type>
                </reducesetinventory_save_order_observer>
            </observers>
        </checkout_type_onepage_save_order_after>
    </events>
</frontend>
<global>
    <models>
        <myname_reducesetinventory>
            <class>MyName_ReduceSetInventory_Model_Observer</class>
        </myname_reducesetinventory>
    </models>
</global>

【问题讨论】:

  • 其他线程对为什么要使用单例有什么看法?
  • 观察者使用Mage::getModel()Mage::getSingleton() 实例化。 “禁用”也是配置选项。

标签: magento singleton


【解决方案1】:

如果模型已经实例化,单例将返回实例,否则将创建一个新实例。非常方便,因为在某些情况下您不想创建另一个要创建的实例(例如配置、订单、报价等)。

【讨论】:

    【解决方案2】:

    来自http://codemagento.com/2011/04/observers-and-dispatching-events/

    &lt;type&gt; - 我一直使用单例,但其他选项可以 “模型”或“对象”。 “单例”将创建对象为 Mage::getSingleton() 而“对象”和“模型”都将使用 Mage::getModel() 创建观察者对象时。

    因此,如果您的观察者在脚本执行期间被多次调用,那么在单例的情况下,您可以在第一次调用观察者时将一些数据保存(“缓存”)在私有/受保护变量中,并在下一次调用时使用它。比如可以缓存一些大查询的结果、外部webservice调用响应等。

    【讨论】:

    • 问题不仅仅在于节省系统资源。在某些情况下,创建另一个对象实例会破坏逻辑(例如核心/会话)。
    猜你喜欢
    • 2012-05-29
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多