Magento's Mage里面的字符串的含义和位置:getSingleton

时间:2015-06-02 19:28:31

标签: magento singleton

这是一个字符串,我在Magento中看到很多类似的字符串:

Mage::getSingleton('checkout/type_onepage');

但是,我试图找出该类所在的位置,以及该字符串的含义是什么。任何人都可以向我解释这个吗?

1 个答案:

答案 0 :(得分:2)

1 / Model

您必须知道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);
}

2 /句柄

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 开头的类。

3 /正确的文件或类

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

4 /一个句柄来统治所有

(我不得不以某种方式放置那个双关语,抱歉。)

现在你有了一个模型的句柄,哪个地图是Mage_Checkout_Model,而你的班级是Type_Onepage Magento可以将这两个组合在一个Mage_Checkout_Model_Type_Onepage的类和Mage/Checkout/Model/Type/Onepage.php的文件中1}}。所以整个句柄( checkout / type_onepage )是由两部分构成的,第一部分是斜杠之前是模型的句柄(在这种情况下,也可以是帮助器或块)。 ..控制器有点不同)和第二个,在斜杠之后是句柄所定义的文件夹/类前缀的文件路径。

5 /你以为这就是全部?

要完全扩展此解释,您还必须知道模块是通过位于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