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

Ian Docherty catalyst at iandocherty.com
Sat Apr 11 09:17:37 GMT 2009


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



More information about the Catalyst mailing list