触发事件时"Mage注册表键已存在"

Geo*_*off 2 registry events magento

我正在尝试挂钩"sales_order_save_after"事件,但是当事件被触发时我不断收到以下错误:

Mage registry key "_singleton/Modulename/Orderobserver" already exists
Run Code Online (Sandbox Code Playgroud)

现在我检查了Orderobserver类是否正确命名,并与xml中对类的调用匹配,但错误仍然存​​在.调用事件的xml如下所示:

<events>
    <sales_order_save_after>
        <observers>
            <modulename>
                <type>singleton</type>
                <class>Modulename/Orderobserver</class>
                <method>generateOrderFile</method>
            </modulename>
        </observers>
    </sales_order_save_after>
  </events>
Run Code Online (Sandbox Code Playgroud)

这个班级被命名Companyname_Modulename_Model_Modulename_Orderobserver.

类文件的名称和位置如下: app/code/local/Companyname/Modulename/Model/Modulename/Orderobserver.php

有趣的是,发生错误时,服务器日志中也会记录以下错误:

client denied by server configuration: 
/var/www/vhosts/path/to/subdomain/httpdocs/app/etc/local.xml 
Run Code Online (Sandbox Code Playgroud)

这可能是权限问题吗?

更新:

我查看了Magento系统Log,并且还记录了以下错误:

Failed opening 'Mage/Retailpro/Model/Orderobserver.php' for inclusion (include_path='/var/www/path/to/subdomain/httpdocs/app/code/local:/var/www/path/to/subdomain/httpdocs/app/code/community:/var/www/path/to/subdomain/httpdocs/app/code/core:/var/www/path/to/subdomain/httpdocs/lib:.:')  in /var/www/path/to/subdomain/httpdocs/lib/Varien/Autoload.php on line 93
Run Code Online (Sandbox Code Playgroud)

Ala*_*orm 9

首先,虽然它可能不是必要的,但改变这一点

<class>Modulename/Orderobserver</class>
Run Code Online (Sandbox Code Playgroud)

<class>modulename/orderobserver</class>
Run Code Online (Sandbox Code Playgroud)

类别名约定是全部小写.

其次,类别名modulename/orderobserver转换为类名

Packagename_Modulename_Model_Orderobserver
Run Code Online (Sandbox Code Playgroud)

所以你已经将你的类文件命名为错误了.最后,由于Magento的自动加载器基于类名,这意味着您的文件需要位于

app/code/local/Packagename/Modulename/Model/Orderobserver.php
Run Code Online (Sandbox Code Playgroud)