Where should be stored the environment dependent c

2019-08-11 10:48发布

问题:

A ZF2 application contains/nneds a lot of different config files: /config/application.config.php, /config/autoload/global.php, /config/autoload/local.php, /module/***/config/module.config.php.

Now I've written a module, that covers the caching functionality for the application, and need different values for the livetime of its items in my local/dev and the live environment. I also would like to be able to switch the cache type dependent on the environment.

Where should such stuff be sored? In /config/autoload/global.php and /config/autoload/local.php? If yes: should it first retrieved from these files in the Module class (e.g. in the onBootstrap() method) or used directly, where it's needed?

(It also would be great, if someone could show a primitive example for saving and getting such config data.)

回答1:

The solution, I'm currently using is:

/config/autoload/global.php and/or /config/autoload/local.php

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

Cache Module class

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

It works fine, but I'm pretty sure, that it's not the best practice / recomended way.



回答2:

Your basic approach is the correct one.

For cache configuration stuff, keep your production values in the global file. That should live in your VCS. (EDIT: however, you should probably omit security sensitive configuration such as database passwords. Add that stuff to production via a local.php to keep it out of version control).

In your local environment, use the local file to override anything that needs to be overridden. IIRC the ZendSkeletonApplication has a .gitignore file that will ignore any local configs built in -- so your local configuration never makes it into git.

However, you don't need to mess around with loading the config on bootstrap like you are. You can just grab the config from the serviceManager inside your factory method:

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

Also - I wouldn't stick 'cache_ttl' as a top-level config key. Instead, try:

global.php

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

That simplifies your factory to just something like:

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

and you can override whatever you want in your local.php config. If all you want to do is change the ttl (leaving all the other global configs):

local.php

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