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

Post on 05-Jul-2015

2.603 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

FormValidator::LazyWay で検証ルールをまとめようDaisuke Komatsu <vkg.taro@gmail.com>

自己紹介• 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 => 'vkg.taro@gmail.com', 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

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

top related