Catalyst::Model::DBIC::Schemaを使ってみました。
DBIx::Classで新しくなったSchemaモデルをCatalystのModelとして使うクラスなのですが、今までのModelと大きく違うのはモデルをアプリケーションの外に追い出すことが出来る点です。
例えば、複数のアプリケーションで認証情報を使いまわしたい時には便利かと思われます。
まずはスキーマを作ります。(Perl/DBIC - Nekokak's core dumpに大変わかりやすい説明があります。)
Schema/ Account.pm Account/ Users.pmSchema/Account.pm
package Schema::Account; use strict; use warnings; use base 'DBIx::Class::Schema'; __PACKAGE__->load_classes(); 1;Schema/Account/Users.pm
package Schema::Account::Users;
use strict;
use warnings;
use base 'DBIx::Class';
__PACKAGE__->load_components(qw/ PK::Auto::MySQL Core/);
__PACKAGE__->table('users');
__PACKAGE__->add_columns(qw/id username password email/);
__PACKAGE__->set_primary_key('id');
1;
このスキーマをMyApp1とMyApp2で使いまわすことにします。
MyApp1 Contoller Model Account.pm View MyApp1 Contoller Model Account.pm View
MyApp1とMyApp2でModelクラスを作ります。
# script/myapp1_create.pl model Account DBIC::Schema Schema::Account dbi:mysq:account user passwd
Account - クラス名
DBIC::Schema - Modelの指定
Schema::Account - Schemaクラス
以下のようなクラスが生成されます。
MyApp1/Model/Account.pm
package MyApp1::Model::Account;
use strict;
use base 'Catalyst::Model::DBIC::Schema';
__PACKAGE__->config(
schema_class => 'Schema::Account',
connect_info => [ 'dbi:mysql:account',
'user',
'passwd',
{
RaiseError => 1,
PrintError => 0,
ShowErrorStatement => 1,
TraceLevel => 0,
AutoCommit => 1,
}
],
);
1;
使うときは
$c->model('Account')->resultset('Users')
さらに便利なのは
$c->mode('Account::Users')
でSchemaモデルが使えます。
もちろん実際に動かす時にはSchemaクラスはクラスパスが通るところにある必要があります。
と、とっても便利なC::M::DBIC::Schemaなんですが、既存のプラグインとあまり相性がよくありません。
特にC::P::Authentication::Store::DBICは全く動かなくなるので注意です。(今、パッチが作られているみたいです。)

コメントする