formvalidator::lazyway で検証ルールをまとめよう

48
FormValidator::LazyWay で 検証ルールをまとめよう Daisuke Komatsu <[email protected] >

Upload: daisuke-komatsu

Post on 05-Jul-2015

2.601 views

Category:

Technology


3 download

DESCRIPTION

CPAN モジュールの FormValidator::LazyWay について

TRANSCRIPT

Page 1: FormValidator::LazyWay で検証ルールをまとめよう

FormValidator::LazyWay で検証ルールをまとめようDaisuke Komatsu <[email protected]>

Page 2: FormValidator::LazyWay で検証ルールをまとめよう

自己紹介• vkgtaro• http://vkgtaro.jp• http://search.cpan.org/~taro/• http://lazy-people.org• http://plucore.jp

Page 3: FormValidator::LazyWay で検証ルールをまとめよう

作者紹介• tomyhero さんが元の作者です。• http://d.hatena.ne.jp/tomyhero/• http://search.cpan.org/~tomyhero/• http://lazy-people.org• • Umakatter• それいけヴ君(18禁)

Page 4: FormValidator::LazyWay で検証ルールをまとめよう

FormValidator::LazyWay ができるまで

Page 5: FormValidator::LazyWay で検証ルールをまとめよう

FormValidator::LazyWay ができるまで

• tomyhero さんは元々 Data::FormValidator のユーザだったらしい

Page 6: FormValidator::LazyWay で検証ルールをまとめよう

FormValidator::LazyWay ができるまで

• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい

Page 7: FormValidator::LazyWay で検証ルールをまとめよう

FormValidator::LazyWay ができるまで

• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味

Page 8: FormValidator::LazyWay で検証ルールをまとめよう

FormValidator::LazyWay ができるまで

• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない

Page 9: FormValidator::LazyWay で検証ルールをまとめよう

FormValidator::LazyWay ができるまで

• tomyhero さんは元々 Data::FormValidator のユーザだったらしい• そこで Catalyst::Plugin::FormValidator::Lazy を作ったらしい• lazy は「遅延」とかの意味じゃなくて「怠けられるよ」と言う意味• Template::Filters::LazyLoader も遅延ロードという意味じゃない• lazy people で Data::FormValidateEm を作り始める

Page 10: 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|'

Page 11: 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 にしようということで

Page 12: 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 にしようということで• この作業は僕がしました。このあたりから参加。

Page 13: 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 にしようということで• この作業は僕がしました。このあたりから参加。• 設計をやり直したりあーだこーだ

Page 14: 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 にしようということで• この作業は僕がしました。このあたりから参加。• 設計をやり直したりあーだこーだ• 仕事で使い始めてみたので許可を得て CPAN にアップ

Page 15: 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 にしようということで• この作業は僕がしました。このあたりから参加。• 設計をやり直したりあーだこーだ• 仕事で使い始めてみたので許可を得て CPAN にアップ• 今の形に落ち着いて放置

Page 16: FormValidator::LazyWay で検証ルールをまとめよう

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 で検証ルールをまとめよう

FV::LazyWay の特徴

Page 18: FormValidator::LazyWay で検証ルールをまとめよう

FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。

Page 19: FormValidator::LazyWay で検証ルールをまとめよう

FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成

Page 20: FormValidator::LazyWay で検証ルールをまとめよう

FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証

Page 21: FormValidator::LazyWay で検証ルールをまとめよう

FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証• 検証前に入力されたデータをフィルタリング

Page 22: FormValidator::LazyWay で検証ルールをまとめよう

FV::LazyWay の特徴• フォームごとにバリデーションルールを作るのではなく、フィールド名ごとにルールを定めて、サイト全体で使い回せます。• エラーメッセージの自動生成• フィールドごとの単純な検証だけでなく、いくつかのフィールドをマージして検証• 検証前に入力されたデータをフィルタリング• 検証後のデータをオブジェクトにして返す

Page 23: FormValidator::LazyWay で検証ルールをまとめよう

フィールド名ごとのルール

•会員登録時の email フィールド• ログイン時の email フィールド• マイページで自分の情報を編集するときの email フィールド

Page 24: FormValidator::LazyWay で検証ルールをまとめよう

フィールド名ごとのルール

•会員登録時の email フィールド• ログイン時の email フィールド• マイページで自分の情報を編集するときの email フィールド

バリデーションルールは全部同じ

Page 25: FormValidator::LazyWay で検証ルールをまとめよう

設定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 で検証ルールをまとめよう

使用方法

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 で検証ルールをまとめよう

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 で検証ルールをまとめよう

検証結果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 で検証ルールをまとめよう

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 で検証ルールをまとめよう

フィールド名を正規表現でマッチ

• regexp_map レベルを使用するとフィールド名の正規表現マッチが可能です

• たとえば '_id$' なフィールド名全部に同じルール

setting: regexp_map: '_id$': rule: - Number#integer

Page 31: FormValidator::LazyWay で検証ルールをまとめよう

項目をマージして検証• 複数の項目をつなげた上で検証

• 年、月、日が別々のフォームから date 項目を内部的に作り出して検証

merge: date: format: "%04d-%02d-%02d" fields: - year - month - day strict: date: rule: - DateTime#date

Page 32: FormValidator::LazyWay で検証ルールをまとめよう

各項目に対する設定• いままで rule だけ書いてきましたが、実は rule 以外に filter, fix があります。

• rule はバリデーションルールの指定• FormValidator::LazyWay::Rule::*• filter は検証直前に入力された内容を変化させます。• FormValidator::LazyWay::Filter::*• fix は検証の後に値を変化させます• FormValidator::LazyWay::Fix::*

Page 33: FormValidator::LazyWay で検証ルールをまとめよう

filter, rule, fix の流れ

fix

filter

rule

検証にかける前に入力内容をフィルタリングする

指定されたルールに基づいて検証する。

検証された値を変更する。

Page 34: FormValidator::LazyWay で検証ルールをまとめよう

設定例

setting: strict: date: filter: - Unify#hyphen rule: - DateTime#date fix: - DateTime#format: - '%Y-%m-%d'

•ハイフンっぽい文字列をハイフンにして、正しい日付かチェックして、DateTime オブジェクトとして取得する

Page 35: FormValidator::LazyWay で検証ルールをまとめよう

検証されたデータの取り出し

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 で検証ルールをまとめよう

カスタムメッセージ

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 で検証ルールをまとめよう

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 で検証ルールをまとめよう

そのほか

Page 39: FormValidator::LazyWay で検証ルールをまとめよう

そのほか• 独自ルールモジュールの読み込み

Page 40: FormValidator::LazyWay で検証ルールをまとめよう

そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule

Page 41: FormValidator::LazyWay で検証ルールをまとめよう

そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定

Page 42: FormValidator::LazyWay で検証ルールをまとめよう

そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える

Page 43: FormValidator::LazyWay で検証ルールをまとめよう

そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える

• 各検証モジュールのメッセージをカスタマイズしておける

Page 44: FormValidator::LazyWay で検証ルールをまとめよう

そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える

• 各検証モジュールのメッセージをカスタマイズしておける messages : ja : rule_message : __field__には__rule__が使用できます。 rule : Email#email : メイルアドレス String#length : $_[min]文字以上で、$_[max]文字以下

Page 45: FormValidator::LazyWay で検証ルールをまとめよう

そのほか• 独自ルールモジュールの読み込み• +OreOre::Rule• 入力値が空だった場合のデフォルト値設定• 同一フィールドに対して複数の値が送られてきた場合に配列として扱える

• 各検証モジュールのメッセージをカスタマイズしておける messages : ja : rule_message : __field__には__rule__が使用できます。 rule : Email#email : メイルアドレス String#length : $_[min]文字以上で、$_[max]文字以下

• POD が日本語なので興味もたれた方は是非ドキュメントを参照してください

Page 46: FormValidator::LazyWay で検証ルールをまとめよう

今後• rule, filter, fix モジュールが少ないので増やしたい

•ルールメッセージの多言語化の実装を変えたい(po ファイルで管理したい)

• upload フィールドの検証をしたい•コードの整理したい

Page 47: FormValidator::LazyWay で検証ルールをまとめよう

ご意見募集中

• リポジトリは CodeRepos にあります• http://svn.coderepos.org/share/lang/perl/FormValidator-LazyWay/

• IRC• irc.lazy-people.org:6667#project

Page 48: FormValidator::LazyWay で検証ルールをまとめよう

ご静聴ありがとうございました