configuration - 如何在 Zend Framework 2 应用程序中的模块的 getConfig() 中使用 global.php/local.php 配置?

标签 configuration zend-framework2 config configuration-files

在 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'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}

它工作正常,但我相信,应该通过模块中的一个中心位置访问模块特定的设置 - ModulegetConfig() 方法类(class)。像这样:

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 它实际上不是 module.config.php 被调用,而是 Module-类配置函数。主要有这些:

如果我明白this part of the ConfigListener正确的话,那么 getConfig() 将首先被调用,并且所有特殊的 {feature}ProviderInterfaces 将覆盖 getConfig() 的数据,但是不要认为这是理所当然的,它需要检查!

关于configuration - 如何在 Zend Framework 2 应用程序中的模块的 getConfig() 中使用 global.php/local.php 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15832546/

相关文章:

gradle - 获取gradle play插件以使用替代application.conf

php - Zend Framework 函数不是 Controller 中的操作

view - Zend Framework 2 中的渲染/响应策略究竟意味着什么以及如何使用它?

.net - 设置文件与 app.config

grails - Grails 3(3.1.10)MultipartResolver

python - Python 包上的 SSL 错误

configuration - 自动配置或创建 hudson 作业

debugging - 无法使用eclipse调试tomcat服务器

testing - ZF2 测试 - serviceManager 忽略的模拟对象

bash - ~/.ssh/config 文件可以使用变量吗?