[Catalyst] Passing connection info to an custom model/external lib

Eric Wright info at rapidsynergy.com
Mon Apr 13 13:02:05 GMT 2009


Thanks for your thoughts guys. These are all good ideas. I figure it's
always good to do a sanity check. :)

Best,
Eric

On Sat, Apr 11, 2009 at 5:17 AM, Ian Docherty <catalyst at iandocherty.com> wrote:
> Eric Wright wrote:
>>
>> I have what I hope is not a dumb question. I'm trying to follow best
>> practices here and am writing a piece of business logic that I feel
>> should be Catalyst agnostic and therefore am creating a custom model.
>> (However, at the moment Catalyst is the primary consumer of this lib.)
>> I'd like to use my DBIC::Schema goodness for DB access and happily
>> have abstracted that via Catalyst::Model::DBIC::Schema. The thing is I
>> realized that if I connect to this schema outside of the scope of
>> Catalyst via DBIx::Class::Schema->connect I have to pass in the
>> connection info separately which really bugs me because I've already
>> defined it via a configuration file for the Catalyst app (using
>> Config::General). I suppose I could just pass that info into the model
>> but that seems messy and redundant to me. If I subclass
>> Catalyst::Model well then I'm tightly coupled with Catalyst again. I'd
>> like to just be able to glue the model to Catalyst and do a:
>>
>> $c->model('MyCustomModel')->foo(...)
>>
>> and it just work.
>>
>> It seems to me there should be a simple way for this schema to know
>> its connection info based on context and I figured there's like a
>> slick Catalyst ninja kind of method for doing this that my brain is
>> just not grasping at the moment. How do you do this sort of thing? Is
>> the magic in the Catalyst glue?
>>
>> Thanks in advance for any advice/thoughts/comments...
>>
>> -Eric
>>
>
> I use an external yaml file to hold connection information. In that way I
> can easily have different
> configurations for different environments, dev, staging, live.
>
> # production database access
> DBIxProd:
>   dsn:            'DBI:mysql:host=localhost;database=myapp_prod'
>   username:       fred
>   password:       secret
> ...
>
> In my Catalyst model I do something like.
>
> package myapp::Model::DBIxProd;
>
> use strict;
> use base 'Catalyst::Model::DBIC::Schema';
>
> __PACKAGE__->config(
>   schema_class    => 'myapp::Storage',
>   connect_info => [
>       myapp->config->{DBIxProd}{dsn},
>       myapp->config->{DBIxProd}{username},
>       myapp->config->{DBIxProd}{password},
>       { 'mysql_enable_utf8' => 1 },
>       { on_connect_do =>[ 'set names utf8' ] },
>   ]);
>
> 1;
>
> And in my external app (usually in a 'tools' subdirectory) I do something
> like.
>
> use FindBin;
> use lib "$FindBin::Bin/../lib";
>
> use myapp::Storage;
> use YAML;
>
> my $config = YAML::LoadFile("$FindBin::Bin/../myapp.yml");
>
> my $schema = myapp::Storage->connect(
>   $config->{DBIxProd}{dsn},
>   $config->{DBIxProd}{username},
>   $config->{DBIxProd}{password},
>   { mysql_enable_utf8  => 1 },
>   { on_connect_do => [ 'set names utf8' ] },
> );
>
>
> Regards
> Ian
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/
>



-- 
-----------------------------------------------------------
Eric Wright
Rapid Synergy LLC
Web Development, Software & Consulting
V: 203.758.9270  F: 203.725.0853
http://www.rapidsynergy.com
-----------------------------------------------------------



More information about the Catalyst mailing list