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

时间:2013-04-05 11:18:03

标签: 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'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}

它工作正常,但我相信,模块特定设置应该通过模块中的一个中心位置访问 - 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配置。我该怎么办?

2 个答案:

答案 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

并更改此本地配置中的配置值。

要理解:

  • 您应该始终为LIVE-Scenario配置最佳模块。
  • 如果您有特定于环境的需求,请使用local-config
  • 覆盖此配置
  • 本地配置永远不会自动部署,这是一项需要从环境内部完成的手动任务

希望这有点清楚

<强>最终

  • 为LIVE-Scenario配置模块
  • 在您的开发计算机上创建/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 - 类配置函数。主要是:

如果我正确理解this part of the ConfigListener,则会先调用getConfig(),所有特殊的{feature}ProviderInterfaces都会覆盖getConfig()的数据,但不要这样做理所当然,需要检查一下!

答案 1 :(得分:1)

您不应该访问Module#getConfig()中的其他模块设置。如果您依赖其他配置,那只能用于服务目的。您可以依赖Module#getServiceConfig()并在工厂内部访问ServiceManager,并使用$serviceManager->get('config');访问您的配置。(请参阅Sam的comment

默认情况下,配置的加载顺序为:

  1. /config/application.config.php,这是初始配置文件;不是模块配置;这是要加载的配置文件的文件名模式('config_glob_paths' => array('config/autoload/{,*.}{global,local}.php'))。
  2. {ModuleNamespace}\Module#getConfig()(例如Cache\Module#getConfig()),根据惯例,应加载其/module/{ModuleNamespace}/config/module.config.php;
  3. /config/autoload/global.php,不应包含任何特定于模块的配置(见下文);
  4. /config/autoload/local.php,包含特定于环境的设置也不应包含任何模块特定的配置(见下文);它不应该版本化/部署;
  5. /config/autoload/{ModuleNamespaceLowerCased}.local.php(例如cache.local.php),仅包含模块和特定于环境的设置,不应为版本化/;
  6. 对于上面的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的answerblog article