这是一个字符串,我在Magento中看到很多类似的字符串:
Mage::getSingleton('checkout/type_onepage');
但是,我试图找出该类所在的位置,以及该字符串的含义是什么。任何人都可以向我解释这个吗?
答案 0 :(得分:2)
您必须知道Mage::getSingleton()
将向您发送一个单例(这是一种常见的开发设计模式)。对于magento,只有模型可以实例化为Singleton
来自app/Mage.php
的片段,你可以看到Magento实际上在场景后面使用了getModel,并且如果你通过getSingleton调用它两次(单例模式的目的)也注册它以拥有该模型的单个实例就像你可能知道的那样)
public static function getSingleton($modelClass='', array $arguments=array())
{
$registryKey = '_singleton/'.$modelClass;
if (!self::registry($registryKey)) {
self::register($registryKey, self::getModel($modelClass, $arguments));
}
return self::registry($registryKey);
}
Magento将通过我们称之为句柄的方式将其组件映射到类。这些是在模块的config.xml中定义的。
来自app/code/core/Mage/Checkout/etc/config.xml
的片段从很多xml中删除
<?xml version="1.0"?>
<config>
<modules>
<Mage_Checkout>
<version>1.6.0.0</version>
</Mage_Checkout>
</modules>
<global>
<models>
<checkout>
<class>Mage_Checkout_Model</class>
</checkout>
</models>
</global>
</config>
此代码段指示magento在其全局配置中添加,对于所有模型,它知道可以通过句柄引用的一组新模型结帐,映射到以 Mage_Checkout_Model 开头的类。
Magento继承自Class_To_File_Path的Zend Framework映射
类名只能包含字母数字字符。类名允许使用数字,但在大多数情况下不鼓励使用。仅允许下划线代替路径分隔符;文件名“Zend / Db / Table.php”必须映射到类名“Zend_Db_Table”。
来源:http://framework.zend.com/manual/1.12/en/coding-standard.naming-conventions.html
这意味着像 type_onepage 这样的构造类型会映射到路径 Type / Onepage.php 且其类名 Type_Onepage 的文件强>
(我不得不以某种方式放置那个双关语,抱歉。)
现在你有了一个模型的句柄,哪个地图是Mage_Checkout_Model
,而你的班级是Type_Onepage
Magento可以将这两个组合在一个Mage_Checkout_Model_Type_Onepage
的类和Mage/Checkout/Model/Type/Onepage.php
的文件中1}}。所以整个句柄( checkout / type_onepage )是由两部分构成的,第一部分是斜杠之前是模型的句柄(在这种情况下,也可以是帮助器或块)。 ..控制器有点不同)和第二个,在斜杠之后是句柄所定义的文件夹/类前缀的文件路径。
要完全扩展此解释,您还必须知道模块是通过位于app/etc/modules
的xml定义的。
由于您要求使用核心模块,因此要查看的文件是Mage_All.xml
,我再次删除了大量代码。
<?xml version="1.0"?>
<config>
<modules>
<Mage_Checkout>
<active>true</active>
<codePool>core</codePool>
<depends>
<Mage_Sales/>
<Mage_CatalogInventory/>
</depends>
</Mage_Checkout>
</modules>
</config>
对于其他模块,建议的方法是使用文件app/code/Mage_Checkout.xml
,其中文件名是xml中<modules>
节点旁边的句柄名称。但是对于核心,由于有很多模块,他们在Mage_All.xml
中将很多模块分组。
在此文件中,您可以看到它与我们之前看到的模块的config.xml
具有相同的开始,因此Magento能够匹配此config.xml
属于此模块的事实在此Mage_All.xml
文件中定义。
然后您还会看到该模块的 codePool 。在这种情况下,核心,Magento的库存模块。但您也可以拥有社区或本地。
现在,Magento可以真正映射到文件。
你的档案是在
app/code/
- 已修复,所有代码都在那里
core/
- 模块的 codePool
Mage/Checkout/Model/
- 映射到 config.xml 中定义的右类的句柄,然后转换为基于Zend Framework惯例的路径
Type/Onepage.php
- 从type_onepage
映射的文件,再次遵循Type / Onepage惯例。
echo get_class(Mage::getSingleton('checkout/type_onepage'));
// will output Mage_Checkout_Model_Type_Onepage
// which is located at app/code/core/Mage/Checkout/Model/Type/Onepage.php