Как пользоваться Глобалом.на PHP/местные.PHP-конфигурации в getConfig () модуля в приложении Zend Framework 2?
В приложении ZF2 у меня есть несколько кофигов, которые: 1. потребность быть различным зависящим от окружающей среды; 2. специфичны для конкретного модуля. Я сейчас использую его как здесь описано:
Глобальный.PHP и местные.php
return array(
    ...
    'modules' => array(
        'Cache' => array(
            'ttl' => 1, // 1 second
        )
    )
    ...
);
Класс модуля
Module {
    ...
    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    'ZendCacheAdapterMemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'           => $this->getConfig()['modules']['Cache']['ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}
Он работает нормально, но я считаю, что конкретные настройки модуля должны быть доступны через одно центральное место в модуле-метод 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(
                    'ZendCacheAdapterMemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'            => $serviceManager->get('Config')['modules']['Cache']['ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}
getConfig() модуля. Как я могу это сделать?2 ответа:
Каждая отдельная конфигурация каждого отдельного загруженного модуля будет объединена в одну единственную конфигурацию. А именно это будет:
$serviceManager->get('config');Причина за
Дистрибутивы не будут загружены, независимо от того, где они находятся. Однако общее понятие ZF2 состоит в том, чтобы скопировать распределяемые файлы в(global|local).config.phpпросто для цели использования. Глобальные конфигурационные файлы всегда должны быть развернуты . Однако локальные конфигурационные файлы должны развертываться только как дистрибутивы, псевдонимlocal.config.php.dist./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И измените конфигурацию значения внутри этой локальной конфигурации.
Чтобы понять:
- вы всегда должны настроить свой модуль как можно лучше для живого сценария.
- Если у вас есть специфические для среды потребности, перепишите эту конфигурацию с помощью local-configЛокальные конфигурации никогда не развертываются автоматически, это ручная задача, которую необходимо выполнить изнутри самой среды
Надеюсь, что это немного больше ясно
В конечном счете:
- настройте свой модуль для живого сценария
- на вашей машине разработки создайте
/config/autoload/mymodule.local.phpи перепишите вашttlс его значением разработкиПорядок загрузки:
Последняя интересная часть, о которой я совершенно забыл, - это порядок загрузки конфигурационных файлов. Поскольку все файлы объединены, это важно отметить!
- первая загрузка-это
/config/application.config.php- второй загрузкой будет каждый модуль
/modules/{module}/config/module.config.php*- И последнее, но не менее важное: будут загружены автоматически загружаемые файлы
/config/autoload/{filename}.phpАстерикс на самом деле Нет
module.config.phpкоторый называется, а точнееModule-классы конфигурационных функций. В основном это:
getConfig()
getServiceConfig()
getViewHelperConfig()- в конечном счете все под
Zend\ModuleManager\Feature\{feature}ProviderInterfaceЕсли я понимаю эту часть
ConfigListenerправильно, тогдаgetConfig()будет вызван первым и все специальные{feature}ProviderInterfacesбудут перезаписывать данныеgetConfig(), но не принимайте это как должное, это потребует проверки!
Вы не должны получать доступ к другим модулям настройки в вашем
Module#getConfig(). Если вы полагаетесь на другую конфигурацию, это может быть только для служебных целей. Следовательно, вы полагаетесь наModule#getServiceConfig(), а внутри фабрик у вас есть доступ кServiceManagerи доступ к вашим конфигурациям с$serviceManager->get('config');. (см. комментарий Сэма )Порядок загрузки конфигураций по умолчанию:
/config/application.config.php, то есть исходный конфигурационный файл; не для конфигураций модулей; вот шаблон имени файла для файлы конфигурации для загрузки определены ('config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')).
{ModuleNamespace}\Module#getConfig()(например,Cache\Module#getConfig()), что по соглашению должно загрузить его/module/{ModuleNamespace}/config/module.config.php;
/config/autoload/global.php, который не должен содержать каких-либо специфичных для модуля конфигураций (см. ниже);
/config/autoload/local.php, который содержит специфические для среды настройки, также не должен содержать никаких специфичных для модуля конфигураций (см. ниже); он не должен быть версионным / развернутым;
/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может быть доступна из любого места, где имеется доступ к сервисному локатору. Например, в заводских методах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 см. ответ Сэма и статью блога .