在ZF2应用程序中,我有一些共同点:1。需要根据环境的不同而不同; 2.具体针对具体模块。我正如我所描述的here那样使用它:
global.php& local.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配置。我该怎么办?
答案 0 :(得分:17)
每个加载的模块的每个配置都将合并到一个配置中。即这将是:
$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
<强> LoadOrder:强>
我完全忘记的最后一个有趣的部分是配置文件的加载顺序。由于所有文件都已合并,因此请务必注意这一点!
/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
如果我正确理解this part of the ConfigListener
,则会先调用getConfig()
,所有特殊的{feature}ProviderInterfaces
都会覆盖getConfig()
的数据,但不要这样做理所当然,需要检查一下!
答案 1 :(得分:1)
您不应该访问Module#getConfig()
中的其他模块设置。如果您依赖其他配置,那只能用于服务目的。您可以依赖Module#getServiceConfig()
并在工厂内部访问ServiceManager
,并使用$serviceManager->get('config');
访问您的配置。(请参阅Sam的comment)
默认情况下,配置的加载顺序为:
/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的answer和blog article。