mage注册表项“_singleton /”已经存在

时间:2013-10-02 17:08:52

标签: magento

我知道有很多帖子都有这个问题,但我猜他们每个都有不同的根源(至少从我检查的内容 - 没有帮助我)。

我试图在点击用户的按钮时触发该事件,但我在浏览器警报Mage registry key "_singleton/" already exists中得到了上面提到的异常。

config.xml的一部分:

.....
     <models>
        <packagecustomernumber>
            <class>Package_CustomerNumber_Model</class>
        </packagecustomernumber>
    </models>

</global>
<frontend>
        <events>
            <checkout_type_onepage_save_order>
                <observers>
                    <type>singleton</type>
                    <class>packageName/customernumber/observer</class>
                    <method>setCustomerNumber</method>
                </observers>
            </checkout_type_onepage_save_order>
        </events>
    </frontend>

班级本身:

class Package_CustomerNumber_Model_Observer
{
    public function setCutomerNumber($observer)
    {
        die('setCutomerNumber');
    }
}

该按钮应该触发甚至检查/保存订单,因此该事件应该是正确的。

有什么建议吗?

3 个答案:

答案 0 :(得分:8)

弹出的第一件事就是这个

<class>packageName/customernumber/observer</class>

那是无效的。这是您告诉Magento用于观察者的类的节点。因此,<class/>节点应该是观察者的完整PHP类名称

<class>Package_CustomerNumber_Model_Observer</class>

或模型的类别名

<class>packagecustomernumber/observer</class>

此外,在运行观察者之前,确保可以实例化模型类是有帮助的。尝试在Magento加载的环境中运行以下代码(脚本,控制器操作,phtml模板等。)

$model = new Package_CustomerNumber_Model_Observer;
var_dump(get_class($model));

$model = Mage::getModel('packagecustomernumber/observer');
var_dump(get_class($model));

如果你无法实例化该类,那么Magento也将无法实现(并且在通过一些步骤触发你的观察者之前更容易测试它)。

答案 1 :(得分:2)

是的,“packageName / customernumber / observer”是问题的根源。

虽然此类引用在其结构中完全不正确,但当您的类引用与global / models / modulename定义不匹配时,实际上会出现问题。即使参考“看起来”正确。

配置:

<config>
<global>
    <models>
        <mymodule>
            <class>My_Module_Model</class>
        </mymodule>
    </models>
    <events>
        <some_event_tag>
            <observers>
                <my_event_observer_method>
                    <class>my_module/observer</class>
                    <method>myEventObserverMethod</method>
                </my_event_observer_method>
            </observers>
        </some_event_tag>
    </events>
</global>
</config>

因为未找到“my_module”/“观察者”,因为未配置“my_module”类组节点,因此结果相同。这个样本的正确用法是“mymodule / observer”。

因此,如果您遇到此错误,请重新读取您的config.xml。

答案 2 :(得分:0)

确保config.xml models部分包含

        <!-- This says that string 'company_module' corresponds to Company_Module_Model pseudo-namespace in getModel() and getSingleton() calls. -->
        <company_module>
            <class>Company_Module_Model</class>
        </company_module>

否则您将无法制作新的模型实例。