日向夏特殊応援部隊

俺様向けメモ

DBIx::Class::Service Released

まだCPANに反映されて居ないと思いますが、DBIx::Class:Serviceと言うモジュールをリリースしました。

どんなモジュールか

複数のテーブルに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に移すかなー。移しました。