首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用global.php/local.php信任ZendFramework2应用程序中模块的getConfig()?

如何使用global.php/local.php信任ZendFramework2应用程序中模块的getConfig()?
EN

Stack Overflow用户
提问于 2013-04-05 11:18:02
回答 2查看 14.3K关注 0票数 2

在一个ZF2应用程序中,我有一些图,即: 1.需要对环境有不同的依赖;2.特定于具体的模块。我现在就像这里描述的那样使用它:

global.php & local.php

代码语言:javascript
复制
return array(
    ...
    'modules' => array(
        'Cache' => array(
            'ttl' => 1, // 1 second
        )
    )
    ...
);

模块类

代码语言:javascript
复制
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方法。如下所示:

代码语言:javascript
复制
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()中。我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-09 10:02:49

您不应该访问Module#getConfig()__中的其他模块设置。如果您依赖其他配置,则只能用于服务目的。因此,您将依赖Module#getServiceConfig(),在工厂中,您确实可以访问ServiceManager__and access,您可以向$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,在那里您可以访问Service。例如,在Cache\Module#getServiceConfig()的工厂方法中

代码语言:javascript
复制
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的回答博客文章

票数 1
EN

Stack Overflow用户

发布于 2013-04-05 11:43:21

每个加载模块的每个配置都将合并为一个配置。即:

代码语言:javascript
复制
$serviceManager->get('config');

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

无论分布在哪里,都不会加载它们。然而,ZF2的常见概念是将可分发性复制到ZF2应用程序的/config/autoload-directory中,并将它们重命名为local.config.php

一个例子:

代码语言:javascript
复制
// 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,因为当您的模块将被更新时,这个文件将不断被覆盖。

然而,人们所能做的是复制:

代码语言:javascript
复制
YourModule/config/local.yourmodule.php.dist
to
/config/autoload/local.yourmodule.php

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

理解

  • 您应该始终将模块配置得尽可能好,以适应实际情况。
  • 如果您有特定于环境的需求,请使用本地- config覆盖此配置。
  • 本地信任从不自动部署,这是一项需要从环境本身执行的手动任务。

希望这件事能更清楚些

最终:

  • 将模块配置为活动场景。
  • 在您的开发机器上创建一个/config/autoload/mymodule.local.php并用它的开发价值覆盖您的ttl

LoadOrder:

最后一个有趣的部分(我已经完全忘记了)是配置文件的加载顺序。当所有文件被合并时,这一点很重要!

  • 首先加载的是/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()的数据,但不要认为这是理所当然的,它需要检查!

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15832546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档