在 ZF2 应用程序中,我有一些配置,即: 1. 需要根据环境而有所不同; 2. 特定于具体模块。我目前正在使用它,就像here所描述的那样:
全局.php 和本地.php
return array(
...
'modules' => array(
'Cache' => array(
'ttl' => 1, // 1 second
)
)
...
);
模块类
Module {
...
public function getServiceConfig() {
try {
return array (
'factories' => array(
'Zend\Cache\Adapter\MemcachedOptions' => 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(
'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
return new MemcachedOptions(array(
'ttl' => $serviceManager->get('Config')['modules']['Cache']['ttl'],
...
));
},
...
)
);
}
...
}
...
}
问题是,我不明白如何访问模块的
getConfig()
中的 global.php/local.php 配置。我该怎么办?
每个加载模块的每个配置都将合并为一个配置。也就是说,这将是:
$serviceManager->get('config');
(global|local).config.php
背后的原因仅仅是为了使用目的。全局配置文件应该始终被部署。 然而,本地配置文件只能部署为可分发文件,别名 local.config.php.dist
。
发行版将不会被加载,无论它们位于何处。然而,ZF2 的常见概念是将可分发文件复制到 ZF2 应用程序的
/config/autoload
目录中,并将其重命名为 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
并更改此本地配置中的配置值。
了解:
希望这能更清楚一点
最终:
/config/autoload/mymodule.local.php
并用它的开发值覆盖您的 ttl
加载订单:
最后一个有趣的部分,我完全忘记了,是配置文件的加载顺序。由于所有文件都已合并,因此请务必注意这一点!
/config/application.config.php
/modules/{module}/config/module.config.php
*/config/autoload/{filename}.php
asterix 实际上,它被称为 NOT
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');
访问您的配置。(请参阅 Sam 的 评论) 配置的加载顺序默认为:
/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 中管理配置的更多信息,请参阅 Sam 的