Как пользоваться Глобалом.на 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'],
...
));
},
...
)
);
}
...
}
...
}
Проблема в том, что я не понимаю, как получить доступ к глобальному.на PHP/местные.PHP-конфигурации в 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 см. ответ Сэма и статью блога .