- 2009/8/18 火曜日 21:00:36
- perl
知人にCPAN Authorになると宣言してから8年、やっとこさなりました。もちろんCPANにアップするだけなら誰だってできるので質の高いモジュールをアップできるように今後は心がけていきたいと思います。
で、初めてアップしたのがFormValidator::Nestedです。
これは、FormValidator::Simple、FormValidator::Lite、FormValidator::LazyWayなんかを参考に作られたFormValidatorです。
上記のモジュール達との主な違いといえる特長は、
- ネストしたパラメータを扱える
- 配列なパラメータを扱える
- profileを継承できる
あたりになるかと思います。
profileはとりあえず今はymlで書いて、そのファイルの置かれたbaseディレクトリを指定してそこからの相対PATHがkeyになるという感じです。(FormValidator::Nested::ProfileProviderの実装を増やすことでここは柔軟に対応可能な予定)
params:
mail:
name: メールアドレス
validators:
- Blank#not_blank
- Email#email
- String#max_length:
max: 100
といった感じのprofileをhoge.ymlとかでprofileディレクトリに保存して
use FormValidator::Nested;
use Class::Param;
my $req = Class::Param->new({mail => 'hoge'});
my $fvt = FormValidator::Nested->new({
profile_provider => FormValidator::Nested::ProfileProvider::YAML->new({
dir => 'profile',
}),
});
my $res = $fvt->validate($req, 'hoge');
if ( $res->has_error ) {
my $error_param_ref = $res->error_params;
while ( my ( $key, $error_params ) = %{$error_param_ref} ) {
foreach my $error_param ( @{$error_params} ) {
warn $error_param->key . ':' . $error_param->msg;
}
}
}
といったコードを実行すると、「mail:メールアドレスの形式が正しくありません」といったwarningが出力されるみたいな使い方ですね。
ネストしたパラメータを扱えるというのはどういうことかというと、
params:
user:
name: ユーザ
nest: hoge
で、huga.ymlを作って(さきほどのhoge.ymlは残したまま)
use FormValidator::Nested;
use Class::Param;
my $req = Class::Param->new({ user => {mail => 'hoge'} });
my $fvt = FormValidator::Nested->new({
profile_provider => FormValidator::Nested::ProfileProvider::YAML->new({
dir => 'profile',
}),
});
my $res = $fvt->validate($req, 'huga');
if ( $res->has_error ) {
my $error_param_ref = $res->error_params;
while ( my ( $key, $error_params ) = %{$error_param_ref} ) {
foreach my $error_param ( @{$error_params} ) {
warn $error_param->key . ':' . $error_param->msg;
}
}
}
とやると「user[mail]:メールアドレスの形式が正しくありません」みたいなwarningになります。ちなみにネストしたパラメータてのはCGI::Expandやそれを利用してるC::P::Params::Nestedなんかの利用を想定してます。Ajaxで動的なフォームを作ったりすると必要になる場面がありますよね。
さらに、配列なパラメータが扱えるというのは
params:
mail:
name: メールアドレス
array: 1
validators:
- Blank#not_blank
- Email#email
- String#max_length:
max: 100
とかでbaz.ymlを作っておいて
use FormValidator::Nested;
use Class::Param;
my $req = Class::Param->new({ mail => ['nihen@megabbs.com', 'hoge'] });
my $fvt = FormValidator::Nested->new({
profile_provider => FormValidator::Nested::ProfileProvider::YAML->new({
dir => 'profile',
}),
});
my $res = $fvt->validate($req, 'baz');
if ( $res->has_error ) {
my $error_param_ref = $res->error_params;
while ( my ( $key, $error_params ) = %{$error_param_ref} ) {
foreach my $error_param ( @{$error_params} ) {
warn $error_param->key . ':' . $error_param->msg;
}
}
}
とやるとやはり「mail:メールアドレスの形式が正しくありません」となるという感じです。
あとは、継承ができるという件ですが
extends: hoge
params:
name:
name: 名前
validators:
- Blank#not_blank
- String#max_length:
max: 100
といったprofileを書くとhoge.ymlとHash::Mergeで結合されたprofileが使われるという感じです。Hash::MergeのbehaviorはFormValidator::Nested::ProfileProviderで指定しています。(あー$behaviorはourにしといたほうがいいかな。)
まぁ、こんなところです。ちとPODがぜんぜん書けていないのでこのエントリの内容も含めそのうちPODは書き足しておきます。それまではtディレクトリの中とかをあさってもらうとsampleになるものが一通りそろってるはずです。
あ、それとcodereposにもhttp://svn.coderepos.org/share/lang/perl/FormValidator-Nested/であげてあるのでパッチ等はこちらでいただけるとうれしいです。(まだgithubに移行してない奴)
あーあとfilterも同じymlでかける(ProfileProviderを共有できる)なんて機能もあります。
params:
tel:
filters:
- String#remove_hyphen
- String#alnum_z2h
validators:
- String#between_length:
min: 10
max: 11
ま、こんな感じ。
コメント:0
トラックバック:0
- この記事のトラックバック URL
- https://blog.everqueue.com/chiba/2009/08/18/275/trackback/
- トラックバックの送信元リスト
- FormValidator::NestedをCPANにアップしました - へぼい日記 より