1

Magento は、書き換えやイベントなどのランタイム構成値を計算する際に、app/etc/modules/Namespace_Module.xml で宣言されたモジュールの依存関係を考慮しますが、モジュール セットアップ スクリプトをシーケンスする際には同様のプロセスに従いません。セットアップ スクリプトはアルファベット順に実行されるため、1 つのモジュールがアルファベット順で後の方にあるモジュールで定義されたセットアップ スクリプトに依存している場合に問題が発生する可能性があります。

関連するコードは次の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で検証済み:

app / 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 に答える