Download - FormValidator::LazyWay で検証ルールをまとめよう
![Page 1: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/1.jpg)
FormValidator::LazyWay で検証ルールをまとめようDaisuke Komatsu <[email protected]>
![Page 2: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/2.jpg)
自己紹介• vkgtaro• http://vkgtaro.jp• http://search.cpan.org/~taro/• http://lazy-people.org• http://plucore.jp
![Page 3: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/3.jpg)
作者紹介• tomyhero さんが元の作者です。• http://d.hatena.ne.jp/tomyhero/• http://search.cpan.org/~tomyhero/• http://lazy-people.org• • Umakatter• それいけヴ君(18禁)
![Page 4: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/4.jpg)
FormValidator::LazyWay ができるまで
![Page 5: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/5.jpg)
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい
![Page 6: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/6.jpg)
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい
![Page 7: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/7.jpg)
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味
![Page 8: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/8.jpg)
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない
![Page 9: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/9.jpg)
FormValidator::LazyWay ができるまで
• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める
![Page 10: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/10.jpg)
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|'
![Page 11: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/11.jpg)
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 にしようということで
![Page 12: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/12.jpg)
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 にしようということで• この作業は僕がしました。このあたりから参加。
![Page 13: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/13.jpg)
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 にしようということで• この作業は僕がしました。このあたりから参加。• 設計をやり直したりあーだこーだ
![Page 14: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/14.jpg)
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 にアップ
![Page 15: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/15.jpg)
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 にアップ• 今の形に落ち着いて放置
![Page 16: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/16.jpg)
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
![Page 17: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/17.jpg)
FV::LazyWay の特徴
![Page 18: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/18.jpg)
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。
![Page 19: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/19.jpg)
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成
![Page 20: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/20.jpg)
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証
![Page 21: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/21.jpg)
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証• 検証前に入力されたデータをフィルタリング
![Page 22: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/22.jpg)
FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証• 検証前に入力されたデータをフィルタリング• 検証後のデータをオブジェクトにして返す
![Page 23: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/23.jpg)
フィールド名ごとのルール
•会員登録時の email フィールド• ログイン時の email フィールド• マイページで自分の情報を編集するときの email フィールド
![Page 24: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/24.jpg)
フィールド名ごとのルール
•会員登録時の email フィールド• ログイン時の email フィールド• マイページで自分の情報を編集するときの email フィールド
バリデーションルールは全部同じ
![Page 25: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/25.jpg)
設定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 => 'パスワード' } },};
この設定は、サイト全体で使い回します。
![Page 26: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/26.jpg)
使用方法
use FormValidator::LazyWay;
my $fv = FormValidator::LazyWay->new($config);my $result = $fv->check($q, { required => [qw/nickname email password/], optional => [qw/message/]});
$fv オブジェクトはサイト全体で使い回すと良いと思う。バリデート時に必須/オプションの項目を指定。
![Page 27: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/27.jpg)
required / optional•たとえば登録時には必須
•検索時には必須じゃない
my $result = $fv->check($q, { required => [qw/title/], optional => [qw/body/]});
my $result = $fv->check($q, { optional => [qw/title body/]});
![Page 28: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/28.jpg)
検証結果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 で指定したものから、検証ルールのメッセージと掛け合わせて自動で生成されています。
![Page 29: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/29.jpg)
level•同じフィールド名で異なるルールを指定したい場合
setting:
strict:
email:
rule:
- Email#email
loose:
email:
rule:
- Email#email_loose
my $result = $fv->check( $cgi, { required => [qw/email/], level => { email => 'loose' } });
![Page 30: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/30.jpg)
フィールド名を正規表現でマッチ
• regexp_map レベルを使用するとフィールド名の正規表現マッチが可能です
• たとえば '_id$' なフィールド名全部に同じルール
setting: regexp_map: '_id$': rule: - Number#integer
![Page 31: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/31.jpg)
項目をマージして検証• 複数の項目をつなげた上で検証
• 年、月、日が別々のフォームから date 項目を内部的に作り出して検証
merge: date: format: "%04d-%02d-%02d" fields: - year - month - day strict: date: rule: - DateTime#date
![Page 32: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/32.jpg)
各項目に対する設定• いままで rule だけ書いてきましたが、実は rule 以外に filter, fix があります。
• rule はバリデーションルールの指定• FormValidator::LazyWay::Rule::*• filter は検証直前に入力された内容を変化させます。• FormValidator::LazyWay::Filter::*• fix は検証の後に値を変化させます• FormValidator::LazyWay::Fix::*
![Page 33: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/33.jpg)
filter, rule, fix の流れ
fix
filter
rule
検証にかける前に入力内容をフィルタリングする
指定されたルールに基づいて検証する。
検証された値を変更する。
![Page 34: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/34.jpg)
設定例
setting: strict: date: filter: - Unify#hyphen rule: - DateTime#date fix: - DateTime#format: - '%Y-%m-%d'
•ハイフンっぽい文字列をハイフンにして、正しい日付かチェックして、DateTime オブジェクトとして取得する
![Page 35: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/35.jpg)
検証されたデータの取り出し
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 として持っています。
![Page 36: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/36.jpg)
カスタムメッセージ
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;}
•独自のメッセージを付加します。
![Page 37: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/37.jpg)
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,});
![Page 38: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/38.jpg)
そのほか
![Page 39: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/39.jpg)
そのほか• 独自ルールモジュールの読み込み
![Page 40: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/40.jpg)
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule
![Page 41: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/41.jpg)
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定
![Page 42: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/42.jpg)
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える
![Page 43: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/43.jpg)
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える
• 各検証モジュールのメッセージをカスタマイズしておける
![Page 44: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/44.jpg)
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える
• 各検証モジュールのメッセージをカスタマイズしておける messages : ja : rule_message : __field__には__rule__が使用できます。 rule : Email#email : メイルアドレス String#length : $_[min]文字以上で、$_[max]文字以下
![Page 45: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/45.jpg)
そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える
• 各検証モジュールのメッセージをカスタマイズしておける messages : ja : rule_message : __field__には__rule__が使用できます。 rule : Email#email : メイルアドレス String#length : $_[min]文字以上で、$_[max]文字以下
• POD が日本語なので興味もたれた方は是非ドキュメントを参照してください
![Page 46: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/46.jpg)
今後• rule, filter, fix モジュールが少ないので増やしたい
•ルールメッセージの多言語化の実装を変えたい(po ファイルで管理したい)
• upload フィールドの検証をしたい•コードの整理したい
![Page 47: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/47.jpg)
ご意見募集中
• リポジトリは CodeRepos にあります• http://svn.coderepos.org/share/lang/perl/FormValidator-LazyWay/
• IRC• irc.lazy-people.org:6667#project
![Page 48: FormValidator::LazyWay で検証ルールをまとめよう](https://reader033.vdocuments.mx/reader033/viewer/2022052601/559935bd1a28ab01178b4596/html5/thumbnails/48.jpg)
ご静聴ありがとうございました