Configuration layouts

A common use case is the need to parametrize an application's config in a way that includes your credentials and the environment's data (for example: db host/port, use of frontend proxy or not, caching, require-ssl, etc). This is simple to achieve until your project starts getting bigger.


The ConfigLoader plugin gives you the chance to load the config by using its suffix. This approach which will look for a local config file, if specified, in the following order of preference:

* $c->config->{ 'Plugin::ConfigLoader' }->{ config_local_suffix }

By default the suffix value is local, which will load myapp_local.conf. If, for example, $ENV{ MYAPP_CONFIG_LOCAL_SUFFIX } is set to testing, ConfigLoader will try to load myapp_testing.conf instead of myapp_local.conf.

Or you could even load local files for each config set directly from your main file:

    # load db config file, in Config::General format
        schema_class My::Schema
            <<include conf/db_local.conf>>

Both of these approaches get in your way when you have X number of applications with Y number of developers and Z number of boxes for each environment (development, testing, staging and production).


So, all you need to do is extend the get_config_local_suffix method from ConfigLoad plugin and implement your own config file loading logic.

For example:

    package MyCompany::Plugin::ConfigLoader;

    use strict;
    use warnings;
    use parent 'Catalyst::Plugin::ConfigLoader';

    use Catalyst::Utils ();
    use Sys::Hostname();

    sub get_config_local_suffix {
        my ($c) = @_;
        my $username = $ENV{USER} || getpwuid($<);
        my ($hostname) = Sys::Hostname::hostname() =~ m/^([^\.]+)/;
        my $env_suffix = Catalyst::Utils::env_value($c, 'CONFIG_ENV_SUFFIX');
        my $config_local_suffix =
            Catalyst::Utils::env_value($c, 'CONFIG_LOCAL_SUFFIX')
            || join('_', grep { $_ } ($username, $hostname, $env_suffix));
        return $config_local_suffix;


Then, in your app class

    use Catalyst qw/+MyCompany::Plugin::ConfigLoader/;

    # ...

    __PACKAGE__->config( 'Plugin::ConfigLoader' => { file => __PACKAGE__->path_to('conf') } );

This loads a config file under conf directory in your application's homedir based on current sysuser and hostname (e.g. myapp_wreis_hercule.conf). You can even set the CONFIG_ENV_SUFFIX environment variable, and it would be appended to the config local suffix (e.g. myapp_wreis_hercule_staging.conf).

Remember that you can load a specific config file at any time by setting MYAPP_CONFIG=/path/to/config/file or CATALYST_CONFIG environment variable.



wreis: Wallace Reis | <>