« FormValidator::Simpleプラグインの作成 | メイン | きよへろさんのPerlコードをリファクタリングしてみる »

FormValidator::SimpleでDBに値が存在しないか確認するプラグイン

Class::DBIをつかって値がDBに登録されていないかを確認するValidator。
使い方は、

create table user(
    id varchar(32) not null primary key,
    email varchar(120) not null unique
);

というテーブルを想定して、idとemailがすでに登録されていないかを確認するには、

FormValidator::Simple->check($q,[
    id=>[
        'NOT_BLANK',
        ['REGEX',qr/^[a-z][a-z0-9]{3,15}$/],
        ['CDBIUNIQUE','MyApp::M::CDBI::User']
    ],
    email=>[
        'NOT_BLANK',
        'EMAIL',
        ['CDBIUNIQUE','MyApp::M::CDBI::User','email']
    ]
]);


Class::DBIクラスの後ろにカラム名をいれると、primary keyではなくそのカラム名で検索して該当するレコードの有無を調べられます。便利。

ソースは以下。

package FormValidator::Simple::Plugin:: CDBIUnique;
use strict;
use FormValidator::Simple::Exception;
use FormValidator::Simple::Constants;
our $VERSION = '0.01';
sub CDBIUNIQUE{
    my ($self, $params, $args) = @_;
    if ( scalar(@$args) == 0){
        FormValidator::Simple::Exception->throw(
            qq/validation "CDBIUNIQUE" needs a Class::DBI class./
        );
    }
     my @args=@$args;
     my $cdbi = shift @args;
     my @ret;
     eval{
         if(@args == 0){
         	 @ret = $cdbi->retrieve($params->[0]);
         }else{
	         @ret = $cdbi->search(@args,$params->[0]);
	     }
     };
    FormValidator::Simple::Exception->throw(
        qq/Error executing $cdbi : $@/
    ) if($@);
    return (@ret > 0) ? FALSE : TRUE;
}

1;


もうすこしコードを見直しが必要かなと思うけど便利なのでAge。

トラックバック

この一覧は、次のエントリーを参照しています: FormValidator::SimpleでDBに値が存在しないか確認するプラグイン:

» FormValidator::Simple::Plugin::CDBI::Unique from Lost-Season
FormValidator::SimpleでDBに値が存在しないか確認するプラグ... [詳しくはこちら]