[Catalyst-commits] r12251 - trunk/examples/CatalystAdvent/root/2009/pen

wreis at dev.catalyst.perl.org wreis at dev.catalyst.perl.org
Tue Dec 8 01:55:49 GMT 2009


Author: wreis
Date: 2009-12-08 01:55:48 +0000 (Tue, 08 Dec 2009)
New Revision: 12251

Added:
   trunk/examples/CatalystAdvent/root/2009/pen/configuration-layouts.pod
Log:
CatalystAdvent: Configuration Layouts - draft

Added: trunk/examples/CatalystAdvent/root/2009/pen/configuration-layouts.pod
===================================================================
--- trunk/examples/CatalystAdvent/root/2009/pen/configuration-layouts.pod	                        (rev 0)
+++ trunk/examples/CatalystAdvent/root/2009/pen/configuration-layouts.pod	2009-12-08 01:55:48 UTC (rev 12251)
@@ -0,0 +1,90 @@
+=head1 Configuration layouts
+
+One of most common use cases is the need to parametrize an application's config in
+a way it includes your credentials and/or the environment's data (for example: db host/port,
+use of frontend proxy or not, caching, require-ssl, etc). It is simple to achieve until
+your project starts to getting bigger.
+
+=head2 Catalyst::Plugin::ConfigLoader
+
+The ConfigLoader plugin gives you the chance to load the config by using its suffix approach
+which will look for a local config file if you specify it in the following order of preference:
+
+=over
+
+=item * C<$ENV{ MYAPP_CONFIG_LOCAL_SUFFIX }>
+
+=item * C<$ENV{ CATALYST_CONFIG_LOCAL_SUFFIX }>
+
+=item * C<$c-E<gt>config-E<gt>{ 'Plugin::ConfigLoader' }-E<gt>{ config_local_suffix }>
+
+=back
+
+By default the suffix value is C<local>, which will load C<myapp_local.conf>, but if for example
+C<$ENV{ MYAPP_CONFIG_LOCAL_SUFFIX }> is set to C<testing>, ConfigLoader will try and load C<myapp_testing.conf>
+instead of C<myapp_local.conf>.
+
+Or you could even load local files for each config set directly from your main file like:
+
+    # load db config file, in Config::General format
+    <Model::Database>
+        schema_class My::Schema
+        <connect_info>
+            <<include conf/db_local.conf>>
+        </connect_info>
+    </Model::Database>
+
+Both of these approaches gets in your way when you have X number of applications with Y number of
+developers and Z number of boxes foreach environment (devel, testing, staging and production) to manage.
+
+=head2 MyCompany::Plugin::ConfigLoader
+
+So, all you just need to do is extend the C<get_config_local_suffix> method from ConfigLoad plugin
+and implement your own logic of loading config files to fit in your requirements.
+
+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;
+    }
+
+    1;
+
+thus, in your app class
+
+    use Catalyst qw/+MyCompany::Plugin::ConfigLoader/;
+
+    # ...
+
+    __PACKAGE__->config( 'Plugin::ConfigLoader' => { file => __PACKAGE__->path_to('conf') } );
+
+that will load a config file under C<conf> dir in your app's homedir based on
+current sysuser and hostname and you could even set the C<CONFIG_ENV_SUFFIX>
+env var, thus it would be appended to the config filename.
+
+Remember that you are still able to load a specific config file at any time by
+setting MYAPP_CONFIG=/path/to/config/file or CATALYST_CONFIG env var.
+
+=head1 See Also
+
+L<Advent Calendar 2007-15>, L<Catalyst Advent Calendar 2008-10>, L<Catalyst::Plugin::ConfigLoader::Multi>.
+
+=head1 AUTHOR
+
+wreis: Wallace Reis | <w.reis at shadowcat.co.uk>




More information about the Catalyst-commits mailing list