运行安装脚本时强制执行Magento模块依赖项

时间:2012-11-30 01:43:16

标签: magento

在计算运行时配置值(如重写,事件等)时,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();
    }

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

1 个答案:

答案 0 :(得分:3)

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

<强> POC

在1.5.1.1中验证:

应用程序的/ etc /模块/ 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>

应用程序/代码/本地/富/模块的/ 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;
}