formvalidator::lazyway で検証ルールをまとめよう
DESCRIPTION
CPAN モジュールの FormValidator::LazyWay についてTRANSCRIPT
FormValidator::LazyWay で検証ルールをまとめようDaisuke Komatsu <[email protected]>
自己紹介• vkgtaro• http://vkgtaro.jp• http://search.cpan.org/~taro/• http://lazy-people.org• http://plucore.jp
作者紹介• tomyhero さんが元の作者です。• http://d.hatena.ne.jp/tomyhero/• http://search.cpan.org/~tomyhero/• http://lazy-people.org• • Umakatter• それいけヴ君(18禁)
FormValidator::LazyWay ができるまで
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める• sed -i -e 's|Data::FormValidateEm|FormValidator::LazyWay|'
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める• sed -i -e 's|Data::FormValidateEm|FormValidator::LazyWay|'• Lazy だと遅延に間違えられるから Lazy Way にしようということで
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める• sed -i -e 's|Data::FormValidateEm|FormValidator::LazyWay|'• Lazy だと遅延に間違えられるから Lazy Way にしようということで• この作業は僕がしました。このあたりから参加。
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める• sed -i -e 's|Data::FormValidateEm|FormValidator::LazyWay|'• Lazy だと遅延に間違えられるから Lazy Way にしようということで• この作業は僕がしました。このあたりから参加。• 設計をやり直したりあーだこーだ
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める• sed -i -e 's|Data::FormValidateEm|FormValidator::LazyWay|'• Lazy だと遅延に間違えられるから Lazy Way にしようということで• この作業は僕がしました。このあたりから参加。• 設計をやり直したりあーだこーだ• 仕事で使い始めてみたので許可を得て CPAN にアップ
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める• sed -i -e 's|Data::FormValidateEm|FormValidator::LazyWay|'• Lazy だと遅延に間違えられるから Lazy Way にしようということで• この作業は僕がしました。このあたりから参加。• 設計をやり直したりあーだこーだ• 仕事で使い始めてみたので許可を得て CPAN にアップ• 今の形に落ち着いて放置
Form Validators• フォームごとにルール決める系
• FormValidator::Simple
• FormValidator::Lite
• Catalyst::Plugin::FormValidator::Simple::Auto
• 一カ所にルールをまとめておける
• 項目ごとルール系
• Data::FormValidator
• FormValidator::Nested
• FV::Simple, FV::Lite, FV::LazyWay を参考にして作られたモジュール。ネストされたデータの検証も可能にしてるらしい。
• フォームも生成する系
• HTML::FormFu
• HTML::AutoForm
FV::LazyWay の特徴
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証• 検証前に入力されたデータをフィルタリング
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証• 検証前に入力されたデータをフィルタリング• 検証後のデータをオブジェクトにして返す
フィールド名ごとのルール
•会員登録時の email フィールド• ログイン時の email フィールド• マイページで自分の情報を編集するときの email フィールド
フィールド名ごとのルール
•会員登録時の email フィールド• ログイン時の email フィールド• マイページで自分の情報を編集するときの email フィールド
バリデーションルールは全部同じ
設定my $config = { rules => [ 'Email', 'String' ], setting => { strict => { email => { rule => ['Email#email'] }, password => { rule => [ { 'String#length' => { 'min' => '4', 'max' => '12' } }, 'String#ascii' ] }, } }, lang => 'ja', labels => { ja => { email => 'メールアドレス', password => 'パスワード' } },};
この設定は、サイト全体で使い回します。
使用方法
use FormValidator::LazyWay;
my $fv = FormValidator::LazyWay->new($config);my $result = $fv->check($q, { required => [qw/nickname email password/], optional => [qw/message/]});
$fv オブジェクトはサイト全体で使い回すと良いと思う。バリデート時に必須/オプションの項目を指定。
required / optional•たとえば登録時には必須
•検索時には必須じゃない
my $result = $fv->check($q, { required => [qw/title/], optional => [qw/body/]});
my $result = $fv->check($q, { optional => [qw/title body/]});
検証結果my $result = $fv->check($q, { required => [qw/nickname email password/], optional => [qw/message/]});
if ( $result->has_error ) { print Dumper $result->error_message;
# output #$VAR1 = { # 'email' => 'メールアドレスが空です。', # 'password' => 'パスワードには4文字以上12文字以下が使用できます。' #};}else {
# OK! print Dumper $result->valid;}
このメッセージは、$config の label で指定したものから、検証ルールのメッセージと掛け合わせて自動で生成されています。
level•同じフィールド名で異なるルールを指定したい場合
setting:
strict:
email:
rule:
- Email#email
loose:
email:
rule:
- Email#email_loose
my $result = $fv->check( $cgi, { required => [qw/email/], level => { email => 'loose' } });
フィールド名を正規表現でマッチ
• regexp_map レベルを使用するとフィールド名の正規表現マッチが可能です
• たとえば '_id$' なフィールド名全部に同じルール
setting: regexp_map: '_id$': rule: - Number#integer
項目をマージして検証• 複数の項目をつなげた上で検証
• 年、月、日が別々のフォームから date 項目を内部的に作り出して検証
merge: date: format: "%04d-%02d-%02d" fields: - year - month - day strict: date: rule: - DateTime#date
各項目に対する設定• いままで rule だけ書いてきましたが、実は rule 以外に filter, fix があります。
• rule はバリデーションルールの指定• FormValidator::LazyWay::Rule::*• filter は検証直前に入力された内容を変化させます。• FormValidator::LazyWay::Filter::*• fix は検証の後に値を変化させます• FormValidator::LazyWay::Fix::*
filter, rule, fix の流れ
fix
filter
rule
検証にかける前に入力内容をフィルタリングする
指定されたルールに基づいて検証する。
検証された値を変更する。
設定例
setting: strict: date: filter: - Unify#hyphen rule: - DateTime#date fix: - DateTime#format: - '%Y-%m-%d'
•ハイフンっぽい文字列をハイフンにして、正しい日付かチェックして、DateTime オブジェクトとして取得する
検証されたデータの取り出し
my $result = $fv->check($q, { required => [qw/nickname email password/], optional => [qw/message/]});
if ( $result->has_error ) { print Dumper $res->error_message;}
# さっきの例で行けばこれは DateTime オブジェクトです。print $result->valid->{date};
• $result は FV::LazyWay::Result オブジェクトです。• $result->valid は検証されたデータを hash として持っています。
カスタムメッセージ
my $result = $fv->check($q, { required => [qw/nickname email password/], optional => [qw/message/]});
$result->custom_invalid( 'email_not_unique', 'ご登録されたメールアドレスは既に登録されています。');
if ( $res->has_error ) { print Dumper $res->error_message;}
•独自のメッセージを付加します。
hash を検証する•param メソッドを持っていないただのハッシュも検証できます
my $wants_to_validate = { nickname => 'vkgtaro', email => '[email protected]', password => 'mypass',};
my $result = $fv->check($q, { required => [qw/nickname email password/], optional => [qw/message/], custom_parameters => $wants_to_validate,});
そのほか
そのほか• 独自ルールモジュールの読み込み
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える
• 各検証モジュールのメッセージをカスタマイズしておける
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える
• 各検証モジュールのメッセージをカスタマイズしておける messages : ja : rule_message : __field__には__rule__が使用できます。 rule : Email#email : メイルアドレス String#length : $_[min]文字以上で、$_[max]文字以下
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える
• 各検証モジュールのメッセージをカスタマイズしておける messages : ja : rule_message : __field__には__rule__が使用できます。 rule : Email#email : メイルアドレス String#length : $_[min]文字以上で、$_[max]文字以下
• POD が日本語なので興味もたれた方は是非ドキュメントを参照してください
今後• rule, filter, fix モジュールが少ないので増やしたい
•ルールメッセージの多言語化の実装を変えたい(po ファイルで管理したい)
• upload フィールドの検証をしたい•コードの整理したい
ご意見募集中
• リポジトリは CodeRepos にあります• http://svn.coderepos.org/share/lang/perl/FormValidator-LazyWay/
• IRC• irc.lazy-people.org:6667#project
ご静聴ありがとうございました