Где следует хранить конфигурацию, зависящую от среды, в приложении Zend Framework 2?

Приложение ZF2 содержит / nneds множество различных конфигурационных файлов: /config/application.config.php , /config/autoload/global.php , /config/autoload/local.php , /module/***/config/module.config.php .

Теперь я написал модуль, который охватывает функциональность кэширования для приложения и требует разных значений для жизни своих элементов в моей локальной / dev и живой среде. Я также хотел бы иметь возможность переключать тип кэша, зависящий от среды.

Где такие вещи должны быть сохранены? В /config/autoload/global.php и /config/autoload/local.php ? Если да: должен ли он сначала извлекаться из этих файлов в классе Module (например, в onBootstrap() ) или использоваться напрямую, где это необходимо?

(Было бы здорово, если бы кто-то мог показать примитивный пример для сохранения и получения таких конфигурационных данных.)

Решение, которое я использую сейчас, это:

/config/autoload/global.php и / или /config/autoload/local.php

 return array( // DB credentials 'db' => array( 'username' => ..., 'password' => ..., 'dbname' => ..., 'host' => ..., ), 'cache_ttl' => 'global/local value for cache live time', ); 

Класс Module кэша

 class Module { private $moduleConfig; public function onBootstrap(MvcEvent $mvcEvent) { $application = $mvcEvent->getParam('application'); $this->moduleConfig = $application->getConfig(); } ... public function getServiceConfig() { try { return array ( 'factories' => array( ... 'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) { return new MemcachedOptions(array( 'ttl' => $this->moduleConfig['cache_ttl'], ... )); }, ... ) ); } ... } } 

Он отлично работает, но я уверен, что это не лучшая практика / рекомендуемый способ.

Ваш основной подход правильный.

Для содержимого конфигурации кэша сохраните свои производственные значения в глобальном файле. Это должно жить в вашей VCS. (EDIT: однако вы, вероятно, должны опустить конфиденциальную конфигурацию безопасности, такую ​​как пароли базы данных. Добавьте этот материал в производство через local.php, чтобы не допустить его контроля версий).

В локальной среде используйте локальный файл, чтобы переопределить все, что нужно переопределить. IIRC ZendSkeletonApplication имеет файл .gitignore, который будет игнорировать любые встроенные локальные конфигурации, поэтому ваша локальная конфигурация никогда не превращает его в git.

Тем не менее, вам не нужно возиться с загрузкой конфигурации в бутстрапе, как и вы. Вы можете просто получить конфигурацию от serviceManager внутри вашего заводского метода:

 public function getServiceConfig() { try { return array ( 'factories' => array( ... 'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) { return new MemcachedOptions(array( // you can just grab your config from the service-manager 'ttl' => $serviceManager->get('Config')['cache_ttl'], ... )); }, ... ) ); } ... } 

Кроме того, я бы не стал использовать кеш-ключ в качестве ключевого файла конфигурации верхнего уровня. Вместо этого попробуйте:

global.php

 return array( 'cache' => array( 'ttl' => ..., 'servers' => ..., ... ) ); 

Это упрощает вашу фабрику только что-то вроде:

 'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) { return new MemcachedOptions( $serviceManager->get('cache') ); }, 

и вы можете переопределить все, что захотите, в вашей конфигурации local.php. Если все, что вы хотите сделать, это изменить ttl (оставив все остальные глобальные конфигурации):

local.php

 return array( 'cache' => array('ttl'=>...) );