2

ZF2 アプリケーションには、いくつかの cofig があります。1. 環境によって異なる必要があります。2. 具体的なモジュールに固有のものです。私は現在、ここで説明されているように使用しています:

global.php & local.php

return array(
    ...
    'modules' => array(
        'Cache' => array(
            'ttl' => 1, // 1 second
        )
    )
    ...
);

モジュールクラス

Module {
    ...
    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'           => $this->getConfig()['modules']['Cache']['ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}

正常に動作していますが、モジュール固有の設定には、モジュール内の 1 つの中心的な場所 (クラスのgetConfig()メソッド)からアクセスする必要があると思います。Moduleこのような:

class Module {

    public function getConfig() {
        $moduleConfig = include __DIR__ . '/config/module.config.php';
        $application = $this->getApplicationSomehow(); // <-- how?
        $applicationModuleConfig = $application->getConfig()['modules'][__NAMESPACE__];
        $config = array_merge($moduleConfig, $applicationModuleConfig);
        return $config;
    }
    ...
    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'            => $serviceManager->get('Config')['modules']['Cache']['ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}

問題は、モジュールの global.php/local.php 構成にアクセスする方法getConfig()です。どうすればいいですか?

4

2 に答える 2

17

ロードされたすべてのモジュールのすべての構成が、1 つの構成にマージされます。つまり、これは次のようになります。

$serviceManager->get('config');

背後にある理由(global|local).config.phpは、単に使用目的のためです。グローバル構成ファイルは常にデプロイする必要があります。ただし、ローカル構成ファイルは、配布可能なエイリアスとしてのみデプロイする必要がありますlocal.config.php.dist

ディストリビューションは、場所に関係なくロードされません。ただし、ZF2 の一般的な概念は、配布/config/autoload可能ファイルを ZF2 アプリケーションのディレクトリにコピーし、それらの名前を次のように変更することです。local.config.php

一例:

// YourModule/config/module.config.php
return array(
    'key' => 1337
);

// YourModule/config/local.yourmodule.php.dist
return array(
    'key' => 7331
);

アプリケーションを公開/デプロイするときは、 のみmodule.config.phpが使用されます。モジュールが更新されると、このファイルは常に上書きされるため、誰かがモジュールの構成を変更したい場合、決して触れません。module.config.php

ただし、人々ができることはコピーすることです:

YourModule/config/local.yourmodule.php.dist
to
/config/autoload/local.yourmodule.php

そして、このローカル構成内の構成値を変更します。

理解するには:

  • ライブ シナリオに合わせて、常にモジュールを可能な限り最適に構成する必要があります。
  • 環境固有のニーズがある場合は、ローカル構成を使用してこの構成を上書きします
  • ローカル構成が自動的に展開されることはありません。これは、環境自体の内部から手動で行う必要があるタスクです。

これがもう少し明確になったことを願っています

最終的に:

  • LIVE シナリオ用にモジュールを構成する
  • 開発マシンで を作成し、その開発値で/config/autoload/mymodule.local.php上書きしますttl

ロードオーダー:

私が完全に忘れていた最後の興味深い部分は、構成ファイルのロード順序です。すべてのファイルがマージされるため、これは重要な注意事項です。

  • 最初にロードするのは/config/application.config.php
  • 2番目にロードするのは各モジュールです/modules/{module}/config/module.config.php*
  • 最後になりましたが、自動読み込み可能なファイルが読み込まれます/config/autoload/{filename}.php

asterix実際にはどちら module.config.phpが呼び出されるのではなく、Module-classes 構成関数が呼び出されます。主に次のとおりです。

のこの部分をConfigListener正しく理解している場合はgetConfig()、最初に呼び出され、すべての特殊化され{feature}ProviderInterfacesたが のデータを上書きしますがgetConfig()、これを当然のことと考えないでください。チェックが必要です!

于 2013-04-05T11:43:21.583 に答える
1

の他のモジュール設定にアクセスすることは想定されていませんModule#getConfig()。他の構成に依存している場合、それはサービス目的でのみ可能です。したがって、信頼Module#getServiceConfig()できる工場内では、ServiceManagerにアクセスでき、 で設定にアクセスできます$serviceManager->get('config');(サムのコメントを参照)

構成のロード順序は、デフォルトでは次のとおりです。

  1. /config/application.config.php、これは初期構成ファイルです。モジュール構成用ではありません。これは、定義された構成ファイルをロードするためのファイル名パターンです ( 'config_glob_paths' => array('config/autoload/{,*.}{global,local}.php'))。
  2. {ModuleNamespace}\Module#getConfig()(例Cache\Module#getConfig())、慣例により、そのをロードする必要があります/module/{ModuleNamespace}/config/module.config.php
  3. /config/autoload/global.php、モジュール固有の構成を含めることはできません (以下を参照)。
  4. /config/autoload/local.php環境固有の設定を含む、モジュール固有の構成も含めないでください (以下を参照)。バージョン管理/デプロイしないでください。
  5. /config/autoload/{ModuleNamespaceLowerCased}.local.php(例cache.local.php)、モジュールと環境固有の設定のみを含み、バージョン管理されるべきではありません/;

上記のCacheモジュールには、次の構成ファイルがあります。

  • /module/Cache/config/module.config.php-- モジュール構成の完全なセット。によってロードされたCache\Module#getConfig()
  • /module/Cache/config/cache.local.php.dist-- 例/config/autoload/cache.local.php
  • /config/autoload/cache.local.php-- 環境固有のモジュール構成

この設定ttlは、Service Locator にアクセスできる任意の場所からアクセスできます。たとえば、ファクトリメソッドではCache\Module#getServiceConfig()

class Module {

    public function getConfig() {
        $moduleConfig = include __DIR__ . '/config/module.config.php';
        $application = $this->getApplicationSomehow(); // <-- how?
        $applicationModuleConfig = $application->getConfig()['modules'][__NAMESPACE__];
        $config = array_merge($moduleConfig, $applicationModuleConfig);
        return $config;
    }
    ...
    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'            => $serviceManager->get('Config')['ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}

ZF2 で構成を管理する方法の詳細については、Sam の回答ブログ記事を参照してください。

于 2013-04-09T10:02:49.263 に答える