Где должны храниться зависящие от среды конфиги в приложении 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()
метод) или используется напрямую, где это необходимо?
(Также было бы здорово, если бы кто-то мог показать примитивный пример для сохранения и получения таких данных конфигурации.)
2 ответа
Ваш основной подход правильный.
Что касается конфигурации кеша, сохраните ваши производственные значения в глобальном файле. Это должно жить в вашем VCS. (РЕДАКТИРОВАТЬ: однако, вы, вероятно, должны пропустить чувствительную к безопасности конфигурацию, такую как пароли базы данных. Добавьте этот материал в производство через 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'],
...
));
},
...
)
);
}
...
}
Кроме того - я бы не вставлял 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'=>...)
);
Решение, которое я сейчас использую:
/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'],
...
));
},
...
)
);
}
...
}
}
Это работает хорошо, но я уверен, что это не лучший способ / рекомендуемый способ.