假设您有一个类名Space_Module_Model_LongModelName
,并且希望将其引用为:
Mage::getModel('module/longmodelname');
这似乎在某些开发环境中有效,但似乎并非在所有环境中都有效。可能与文件系统区分大小写设置有关。
您在它不起作用的环境中遇到的错误是include()
forSpace/Module/Model/Longmodelname.php
失败。
假设您有一个类名Space_Module_Model_LongModelName
,并且希望将其引用为:
Mage::getModel('module/longmodelname');
这似乎在某些开发环境中有效,但似乎并非在所有环境中都有效。可能与文件系统区分大小写设置有关。
您在它不起作用的环境中遇到的错误是include()
forSpace/Module/Model/Longmodelname.php
失败。
您的 config.xml 中有一个名为 global/models/yourpackage 的配置节点,您可以在其中保存类模型的前缀。
当您调用 Mage::getModel('packagename/classname') Magento 获取此配置节点时,例如 Company_Yourmodule_Models 添加一个 _ ,然后是带有大写首字母的类名:
Company_Yourmodule_Models_Classname
如果您有 cAMElcaSe 类名,则方法相同。因此,假设您的班级名称是 ClassName 那么您必须调用 Mage::getModel('packagename/className') 并且magento将其解析为: Company_Yourmodule_Models_ClassName
app/code/core/Mage/Core/Model/Config.php
具体看一下getGroupedClassName();
,您会注意到uc_words
在构建 时在方法中使用了$className
,它会将类名字符串中的每个其他单词大写。
所以你的类名将LongModelName
成为Longmodelname
包含。
您可以轻松地扩展它以按照您想要的方式工作,但由于它是 Magento 工厂一代的主要部分,我不会因为害怕破坏其他 3rd 方模块而接触它,并且使用非骆驼案例命名空间。
ImportExport 起作用的原因是因为它是模块名称而不是类名称。我以前也遇到过同样的问题,而且很烦人,我倾向于只保留非骆驼式的类名。
肯定有可能使用驼峰式 - 您可以在 Magento 核心中看到模块,例如 ImportExport。我认为一切都是关于在 xmls 中设置正确的(使用骆驼案例)名称
四年后,另一个注释:
如果除了文件名之外还想使用驼峰命名的类名,请确保{moduleName}/etc/config.xml的以下部分也是驼峰命名的:
```xml
<global>
<models>
<ProbablyYourCompanyOrModuleName>
<ModuleName_resource>
<entities>
<!-- "longModelName" below should be CamelCased, but prob the first letter will be lowercased -->
<longModelName>
<table>your_db_table_name</table>
</longModelName>
</entities>
</ModuleName_resource>
</ProbablyYourCompanyOrModuleName>
</models>
</global>
```
该部分应为驼峰式,首字母小写。否则,你会得到一个例外Can't retrieve entity config: yourmodule/longModelName
(见Mage_Core_Model_Resource::getTableName()
)