Как пользоваться Глобалом.на 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 см. ответ Сэма и статью блога .