« フォームの入力を確認するData::FormValidatorとFormValidator::Simple | メイン | FormValidator::SimpleでDBに値が存在しないか確認するプラグイン »

FormValidator::Simpleプラグインの作成

1つ前のエントリーのFormValidator::Simpleは、validationに使うプラグインが簡単につくれるのも良いところ。すでにCPANにも

のといったプラグインがあがってます。

プラグインを使うには、FormValidator::Simple::Plugin::Japaneseならば

use FormValidator::Simple qw/Japanese [他モジュール]/;

または

FormValidator::Simple->load_plugin('FormValidator::Simple::Plugin:: Japanese'[,他モジュール]);

で利用できます。

プラグインは以下のような形で作成できる。

package FormValidator::Simple::Plugin::Example;

use strict;
use FormValidator::Simple::Exception;
use FormValidator::Simple::Constants;

sub EXAMPLE {
  my ($self, $params, $args) = @_;
  return ($params->[0]) ? TRUE : FALSE;
}

1;

$params, $argsの中身は下で説明します。

利用の方法は、

use FormValidator::Simple qw/Example/;
FormValidator::Simple->check($q=>[
  param1=>['NOT_BLANK',['EXAMPLE','arg1','arg2','arg3']],   #Aパターン
  {param=>[param1,param2]}=>['NOT_BLANK',['EXAMPLE','arg1','arg2','arg3']]   #Bパターン
]);

このとき、FormValidator::Simple::Plugin::Example中のEXAMPLEの引数の中身は

$params=[param1];#Aパターン
$params=[param1,param2];#Bパターン
$args=[arg1,arg2,arg3];

になってます。

せっかくなんで、プラグインを書いてみた。

FormValidator::Simple::Plugin::Subroutine
validatorに無名サブルーチンを使えます。

package FormValidator::Simple::Plugin::Subroutine;

use strict;
use FormValidator::Simple::Exception;
use FormValidator::Simple::Constants;

our $VERSION = '0.01';

sub SUBROUTINE {
    my ($self, $params, $args) = @_;
    if ( scalar(@$args) == 0 || ref($args->[0]) ne "CODE") {
        FormValidator::Simple::Exception->throw(
            qq/validation "SUBROUTINE" needs a subroutine reference/
        );
    }
    my @args=@$args;
    my $data = $params->[0];
    my $subroutine = shift(@args);
    my $ret;
    eval{
        $ret = $subroutine->($data,@args);
    };
    FormValidator::Simple::Exception->throw(
        qq/Error executing  subroutine : $@/
    ) if($@);
    return ($ret) ? TRUE : FALSE;
}

1;

最後の手段的プラグイン。
使い方は、

use FormValidator::Simple qw/Subroutine/;
my $results = FormValidator::Simple->check(
  param=>[['SUBROUTINE',sub{
    my($data,@args)=@_;
    #確認コード
    return ($data) ? 1 : 0;
  },'arg1','arg2']]
);

DBに接続してIDやメールアドレスがすでに使われていないか確認したり用途はあると思われです。

コメント

始めまして。
仕事でCGIApp + FormValidator::Simple使っているのですが、こういうのないかなーと思っていたらここにたどり着きました。記事が去年やからもっと早めにみつけていればと、、。(DBの接続とかのところは今までFormValidatorなしでやってました。。あーはずかし、、)
とはいえほんと助かりました。

DBでの確認は、
FormValidator::Simple::Plugin::CDBI::Unique
FormValidator::Simple::Plugin::DBIC::Unique
なんていうのもあります。

SUBROUTINE、EVALUTIONとかで、CPANにあげようかなぁ。

コメントを投稿