2

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

它工作正常,但我相信,模块特定设置应该通过模块中的一个中心位置访问——类的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'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}

问题是,我不明白如何访问模块中的 global.php/local.php 配置getConfig()。我该怎么做?

4

2 回答 2

17

每个加载的模块的每个配置都将合并到一个配置中。即这将是:

$serviceManager->get('config');

背后的原因(global|local).config.php仅仅是为了使用目的。应始终部署全局配置文件。然而,本地配置文件只能部署为可分发的别名local.config.php.dist

Distributionals 不会被加载,无论它们在哪里。然而 ZF2 的常见概念是将可分发文件复制到/config/autoloadZF2 应用程序的 - 目录中并将它们重命名为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 覆盖此配置
  • 本地配置永远不会自动部署,这是一项需要从环境本身内部完成的手动任务

希望这更清楚一点

最终:

  • 为实时场景配置您的模块
  • 在您的开发机器上创建一个并用它的开发价值/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-classes 配置函数。主要是这些:

如果我对这部分的ConfigListener理解正确,那么getConfig()将首先被调用,所有的专业{feature}ProviderInterfaces都会覆盖 的数据getConfig(),但不要认为这是理所当然的,它需要检查!

于 2013-04-05T11:43:21.583 回答
1

您不应该访问Module#getConfig(). 如果您依赖其他配置,则只能用于服务目的。因此,您将依赖Module#getServiceConfig()并在您可以访问ServiceManager和访问您的配置的工厂内部使用$serviceManager->get('config');. (见山姆的评论

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

  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),仅包含模块和环境特定设置,不应进行版本控制/;

对于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 的回答博客文章

于 2013-04-09T10:02:49.263 回答