在一个ZF2应用程序中,我有一些图,即: 1.需要对环境有不同的依赖;2.特定于具体的模块。我现在就像这里描述的那样使用它:
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'],
...
));
},
...
)
);
}
...
}
...
}它运行得很好,但我相信,应该在模块中的一个中心位置访问特定于模块的设置-- Module类的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'],
...
));
},
...
)
);
}
...
}
...
}问题是,我不明白如何访问global.php/local.php在模块的getConfig()中。我该怎么做呢?
发布于 2013-04-09 10:02:49
您不应该访问Module#getConfig()__中的其他模块设置。如果您依赖其他配置,则只能用于服务目的。因此,您将依赖Module#getServiceConfig(),在工厂中,您确实可以访问ServiceManager__and access,您可以向$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,在那里您可以访问Service。例如,在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的回答和博客文章。
发布于 2013-04-05 11:43:21
每个加载模块的每个配置都将合并为一个配置。即:
$serviceManager->get('config');(global|local).config.php背后的原因仅仅是为了使用。全局配置文件应该始终是部署的。但是,本地配置文件只应部署为可分发的别名local.config.php.dist。
无论分布在哪里,都不会加载它们。然而,ZF2的常见概念是将可分发性复制到ZF2应用程序的/config/autoload-directory中,并将它们重命名为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并用它的开发价值覆盖您的ttlLoadOrder:
最后一个有趣的部分(我已经完全忘记了)是配置文件的加载顺序。当所有文件被合并时,这一点很重要!
/config/application.config.php/modules/{module}/config/module.config.php */config/autoload/{filename}.php。asterix实际上调用的不是 module.config.php,而是Module-classes配置函数。主要有:
getConfig()getServiceConfig()getViewHelperConfig()Zend\ModuleManager\Feature\{feature}ProviderInterface下的一切如果我正确理解了ConfigListener,那么首先调用getConfig(),所有专门的{feature}ProviderInterfaces都会覆盖getConfig()的数据,但不要认为这是理所当然的,它需要检查!
https://stackoverflow.com/questions/15832546
复制相似问题