DBIx::Class::Service Released
まだCPANに反映されて居ないと思いますが、DBIx::Class:Serviceと言うモジュールをリリースしました。
- /lang/perl/DBIx-Class-Service/trunk (CodeRepos)
- DBIx-Class-Service-0.02 - Aggregate DBIC processes between multiple tables. - metacpan.org
どんなモジュールか
複数のテーブルにinsertしたりする処理をまとめて書く為のモジュールです。
具体的に言えば、
package MySchema::Service::User; use base qw(DBIx::Class::Service); sub add_user: Transaction { my ($class, $schema, $args) = @_; my $user_rs = $schema->resultset('User'); my $user = $user_rs->create({ user_seq => undef, user_id => $args->{user_id}, password_digest => crypt($args->{password}, $args->{user_id}), }); $user->create_related('profiles', { name => $args->{name}, nickname => $args->{nickname}, }); return $user; } 1;
みたいな感じで書けて、Schemaクラスにて、
package MySchema::Schema; use base 'DBIx::Class::Schema'; __PACKAGE__->load_classes; __PACKAGE__->load_components(qw/ServiceManager/); __PACKAGE__->load_services({ 'MySchema::Service' => [qw/ User /] });
こんな風に書くと、
use MySchema::Schema; my $schema = MySchema::Schema->connect($dsn, $dbuser, $dbpass); eval { $schema->service('User')->add_user($args); }; if ($@) { print STDERR $@; }
みたいな感じで書けます。
なお、Transaction attributeを付けるとその部分はtxn_begin, txn_commitで囲われて、エラーが起きた場合はtxn_rollbackしてcroakするだけです。
と言う訳で
ご意見やバグレポートとかあればお知らせ下さい。CodeReposに移すかなー。移しました。