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。