DBIx::SkinnyでFormValidator::Simple::Plugin::DBIC::Uniqueを使う

Skinny使い始めて、FV::SimpleでDBIC::Uniqueなバリデーションは自分でPlugin書かないとダメかと思ったけど、自分の使い方だとそのままいけたのでメモっとく。

FV::Simple::Plugin::DBIC::Uniqueは指定のクラスがDBIC互換のcountメソッドを持っていれば問題なく動くので、SkinnyをラップしたModelのクラスにcount()を実装してやればOK。

package MyApp::User;

use FormValidator::Simple qw/DBIC::Unique/;

sub validate {
    my ($self, $args) = @_;
    my $result = FormValidator::Simple->check($args => [
        id   => [ qw/UINT/ ],
        name => [ qw/NOT_BLANK ASCII/, [ qw/LENGTH 0 255/ ] ],
        { name => [ qw/id name/ ] } => [ [ 'DBIC_UNIQUE', __PACKAGE__, '!id', 'name' ] ],
    ]);
    return $result if $result->success;
    croak $result;
}

sub count {
    my ($class, $args) = @_;
    MyApp::DB->count('users', 'id', $args);
}

とか書けば、MyApp::User->validate({ id => 1, name => 'nekoya'}); とかできます。

DBIx::Skinnyは各自で好みのラッパを書いてなんぼだと思うので、そのへんのノウハウがもっと出てくるといいすね。