1

Magento 在计算运行时配置值(如重写、事件等)时会考虑 app/etc/modules/Namespace_Module.xml 中声明的任何模块依赖关系,但是在对模块设置脚本进行排序时,它不会遵循类似的过程。设置脚本按字母顺序执行,当一个模块依赖于在字母表后面的模块中定义的设置脚本时,这可能会导致问题。

相关代码在applyAllDataUpdates方法中Mage_Core_Model_Resource_Setup

    $resources = Mage::getConfig()->getNode('global/resources')->children();
    foreach ($resources as $resName => $resource) {
        <snip/>
        $setupClass->applyDataUpdates();
    }

是否有安全/首选/推荐选项来确保在运行所需脚本之前已执行必要的设置脚本?

4

1 回答 1

3

我很想知道用例,但我看到模块依赖关系在这个区域产生了影响,这是可以预料的,因为所有配置文件都是根据模块声明条目 + 依赖规范加载的。

POC

在 1.5.1.1 中验证:

应用程序/etc/modules/a.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Foo_Module>
            <active>true</active>
            <codePool>local</codePool>
        </Foo_Module>
        <Mage_Eav>
            <depends>
                <Foo_Module />
            </depends>
        </Mage_Eav>
    </modules>
</config>

app/code/local/Foo/Module/etc/config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Foo_Module>
            <version>0.1</version>
        </Foo_Module>
    </modules>
    <global>
        <resources>
            <foo_module_setup>
                <setup>
                    <module>Foo_Module</module>
                </setup>
            </foo_module_setup>
        </resources>
    </global>
</config>

Mage_Core_Model_App

public function run($params)
{
    $options = isset($params['options']) ? $params['options'] : array();
    $this->baseInit($options);

    if ($this->_cache->processRequest()) {
        $this->getResponse()->sendResponse();
    } else {
        $this->_initModules();
        $this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);

        if ($this->_config->isLocalConfigLoaded()) {
            $scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
            $scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
            $this->_initCurrentStore($scopeCode, $scopeType);
            $this->_initRequest();
    /*Dump resource node here: */
            var_dump(Mage::getConfig()->getNode('global/resources')->children()); die;
            Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
        }

        $this->getFrontController()->dispatch();
    }
    return $this;
}
于 2012-11-30T03:57:43.243 回答