应该在Zend Framework 2应用程序中存储环境相关配置的位置?

时间:2013-04-04 23:27:29

标签: php configuration zend-framework2 config configuration-files

ZF2应用程序包含许多不同的配置文件:/config/application.config.php/config/autoload/global.php/config/autoload/local.php/module/***/config/module.config.php

现在我已经编写了一个模块,它涵盖了应用程序的缓存功能,并且需要在本地/ dev和实时环境中为其项目的实时时间设置不同的值。我也希望能够根据环境切换缓存类型。

这些东西应该放在哪里?在/config/autoload/global.php/config/autoload/local.php?如果是:是否应首先从Module类中的这些文件中检索(例如,在onBootstrap()方法中)或直接使用它,在哪里需要它?

(如果有人能够显示保存和获取此类配置数据的原始示例,那也会很棒。)

2 个答案:

答案 0 :(得分:2)

我目前使用的解决方案是:

/config/autoload/global.php和/或/config/autoload/local.php

return array(
    // DB credentials
    'db' => array(
        'username'  => ...,
        'password'  => ...,
        'dbname'    => ...,
        'host'      => ...,
    ),
    'cache_ttl' => 'global/local value for cache live time',
);

缓存Module

class Module {

    private $moduleConfig;

    public function onBootstrap(MvcEvent $mvcEvent) {
            $application = $mvcEvent->getParam('application');
            $this->moduleConfig = $application->getConfig();
    }

    ...

    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    ...
                    'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'           => $this->moduleConfig['cache_ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
}

它工作正常,但我很确定,这不是最好的做法/推荐方式。

答案 1 :(得分:2)

您的基本方法是正确的。

对于缓存配置内容,请将生产值保留在全局文件中。那应该存在于你的VCS中。 (编辑:但是,您应该省略安全敏感配置,例如数据库密码。通过local.php将其添加到生产中以防止其超出版本控制。)

在本地环境中,使用本地文件覆盖需要覆盖的任何内容。 IIRC ZendSkeletonApplication有一个.gitignore文件,它会忽略内置的任何本地配置 - 所以你的本地配置永远不会成为git。

但是,您不需要像在运行时那样在引导程序中加载配置。您可以从工厂方法中的serviceManager中获取配置:

public function getServiceConfig() {
    try {
        return array (
            'factories' => array(
                ...
                'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
                    return new MemcachedOptions(array(
                        // you can just grab your config from the service-manager
                        'ttl'           => $serviceManager->get('Config')['cache_ttl'],
                        ...
                    ));
                },
                ...
            )
        );
    }
    ...
}

另外 - 我不会将'cache_ttl'作为顶级配置键。相反,尝试:

<强> global.php

return array(
    'cache' => array(
        'ttl' => ...,
        'servers' => ...,
        ...
    )
);

这简化了您的工厂:

'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
    return new MemcachedOptions( $serviceManager->get('cache') );
},

你可以在local.php配置中覆盖你想要的任何内容。如果您想要做的就是更改ttl(保留所有其他全局配置):

<强> local.php

return array(
    'cache' => array('ttl'=>...)
);