1

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

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

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

(如果有人可以展示一个保存和获取此类配置数据的原始示例,那也很棒。)

4

2 回答 2

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

它工作正常,但我很确定,这不是最佳实践/推荐的方式。

于 2013-04-05T00:07:15.847 回答
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'作为顶级配置键。相反,请尝试:

全局.php

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

这将您的工厂简化为:

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

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

本地.php

return array(
    'cache' => array('ttl'=>...)
);
于 2013-04-05T03:04:54.157 回答