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

问题描述 投票:0回答:2

在 ZF2 应用程序中,我有一些配置,即: 1. 需要根据环境而有所不同; 2. 特定于具体模块。我目前正在使用它,就像here所描述的那样:

全局.php 和本地.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 配置。我该怎么办?

php configuration zend-framework2 config configuration-files
2个回答
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

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

了解:

  • 您应该始终针对实时场景尽可能地配置模块。
  • 如果您有特定于环境的需求,请使用本地配置覆盖此配置
  • 本地配置永远不会自动部署,这是需要从环境本身内部完成的手动任务

希望这能更清楚一点

最终:

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

加载订单:

最后一个有趣的部分,我完全忘记了,是配置文件的加载顺序。由于所有文件都已合并,因此请务必注意这一点!

  • 首先加载的是
    /config/application.config.php
  • 第二个加载的是每个模块
    /modules/{module}/config/module.config.php
    *
  • 最后但并非最不重要的一点是,将加载可自动加载文件
    /config/autoload/{filename}.php

asterix 实际上,它被称为 NOT

module.config.php
,而是
Module
类配置函数。主要有这些:

如果我正确理解了ConfigListener

的这一部分,那么getConfig()
将首先被调用,所有特殊的
{feature}ProviderInterfaces
将覆盖
getConfig()
的数据,但不要认为这是理所当然的,它需要检查!


1
投票

您不应该访问Module#getConfig()

中的其他模块设置。如果您依赖其他配置,则只能用于服务目的。因此,您需要依赖 
Module#getServiceConfig()
,并且在工厂内部您确实可以访问 
ServiceManager
,并使用 
$serviceManager->get('config');
访问您的配置。
(请参阅 Sam 的
评论

配置的加载顺序默认为:

  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 的

answer博客文章

© www.soinside.com 2019 - 2024. All rights reserved.