- 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にアップしました - へぼい日記 より