NAME

FormValidator::LazyWay - フォーム検証用モジュール

SYNOPSIS

use strict;
use warnings;
use Data::Dumper;
use CGI;
use FormValidator::LazyWay;

my $config = {
    'setting' => {
        'strict' => {
            'email'    => { 'rule' => [ 'Email#email' ] },
            'password' => {
                'rule' => [
                    {   'String#length' => {
                            'min' => '4',
                            'max' => '12'
                        }
                    },
                    'String#ascii'
                ]
            }
        }
    },
    'lang'   => 'ja',
    'labels' => {
        'ja' => {
            'email'    => 'メールアドレス',
            'password' => 'パスワード'
        }
    },
    'rules' => [ 'Email', 'String' ]
};

my $fv  = FormValidator::LazyWay->new(config => $config);
my $cgi = new CGI( { password => 'e' } );
my $res = $fv->check( $cgi, { required => [qw/email password/], } );

if ( $res->has_error ) {
    print Dumper $res->error_message;
    # output  
    #$VAR1 = {
    #  'email' => 'メールアドレス�空白��。',
    #  'password' => 'パスワード��4文字以上12文字以下�使用����。'
    #};
}
else {

    # OK!
    print Dumper $res->valid;
}

DESCRIPTION

ã�“ã�®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã�¯ã�¾ã� 開発段階ã�§ã�™ã�®ã�§ã€�仕様ã�Œå¤‰æ›´ã�•れるæ��れã�Œã�‚りã�¾ã�™ã€‚

フォーム検証用モジュールFormValidator::LazyWay��フォーム�������アプリケーション全体�使用�る目的�作����り��。 フォーム���検証ルールを設定�る������フィールド����検証ルールを設定�る���より�よりDRY�コードを書�����手��を���。

ã�¾ã�Ÿã€�検証用モジュールã�”ã�¨ã�«ã€�検証内容を設定ã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�¾ã�™ã€‚ã��ã�®æƒ…å ±ã‚’å…ƒã�«ã€�エラーメッセージを作æˆ�ã�™ã‚‹ã�®ã�§ã€� エラーメッセージを考ã�ˆã‚‹æ‰‹é–“も短縮ã�§ã��るよã�†ã�«ã�ªã�£ã�¦ã�„ã�¾ã�™ã€‚

QUICK START

簡�������フォームを例を基��使�方�説明を�����。

コンフィグ設定

今回�YAML�設定ファイルを作������。 使用�る�����データを�ッシュ���データ���������好��方法を�利用下��。

rules�指定�れ��る���使用�る検証用モジュール���。 詳細� FormValidator::LazyWay::Rule::Email FormValidator::LazyWay::Rule::String を�確�下��。

rules :
    - Email
    - String
lang : ja
setting :
    strict :
        email :
            rule :
                - Email#email
        message :
            rule :
                - String#length :
                    min : 1
                    max : 500
        user_key :
            rule :
                - String#length :
                    min : 4
                    max : 12
                - String#ascii 
labels :
    ja :
        email    : メールアドレス
        message  : ������内容
        user_key : ユーザID

準備

設定ファイルã�‹ã‚‰å�–り出ã�—ã�Ÿãƒ‡ãƒ¼ã‚¿ã‚’ã€�newã�®å¼•æ•°ã�¨ã�—ã�¦æ¸¡ã�™ã� ã�‘ã�§ã�™ã€‚ã�“れã�§æº–備完了ã�§ã�™ã€‚

use FormValidator::LazyWay;
use YAML::Syck;
use FindBin;
use File::Spec;

my $conf_file = File::Spec->catfile( $FindBin::Bin, 'conf/inquery-sample.yml' );
my $config = LoadFile($conf_file);
my $fv = FormValidator::LazyWay->new( config => $config );

検証フィールド�設定

検証フィールドã�®è¨­å®šã‚’ã�Šã�“ã�ªã�„ã�¾ã�™ã€‚ã��ã�®ãƒ•ィールドã�Œå¿…é ˆã�®å ´å�ˆã�¯ã€�required , ã�‚ã�£ã�¦ã‚‚ã�ªã��ã�¦ã‚‚良ã�„å ´å�ˆã�¯ã€�optionalã�«è¨­å®šã�—ã�¾ã�™ã€‚

my $cgi = new CGI() ;

my $res = $fv->check( $cgi , {
    required => [qw/email message/],
    optional => [qw/user_key/],
});

# 検証�エラー���場�
if( $res->has_error ) {
    warn Dumper $res->error_message;
}
else {
    # 検証�������場� 
    warn Dumper $res->valid;
}

実行�果

正常�データ�試��際
my $cgi = new CGI( { email => 'tomohiro.teranishi@gmail.com' , use_key => 'tomyhero' , message => '�����ん' } ) ;

$res->valid �中身�dump�れ��。

$VAR1 = {
    'email' => 'tomohiro.teranishi@gmail.com',
    'message' => '�����ん'
};
å¿…è¦�ã�ªãƒ‡ãƒ¼ã‚¿ã�Œè¶³ã‚‰ã�ªã�„å ´å�ˆ
my $cgi = new CGI( { message => '�����ん' } ) ;

$res->error_message ã�«ã�¯ä»¥ä¸‹ã�®ãƒ‡ãƒ¼ã‚¿ã�Œæ ¼ç´�ã�•れã�¾ã�™ã€‚

$VAR1 = {
    'email' => 'メールアドレス�空白��。'
};
フォーマットã�Œé–“é�•ã�£ã�¦ã‚‹å ´å�ˆ
my $cgi = new CGI( { email => 'email' , use_key => 'tom' , message => '�����よ�'  } ) ;

$res->error_message ã�«ã�¯ä»¥ä¸‹ã�®ãƒ‡ãƒ¼ã‚¿ã�Œæ ¼ç´�ã�•れã�¾ã�™ã€‚

$VAR1 = {
    'email' => 'メールアドレス��メールアドレス�書��使用����。'
};

設定�説明

rules

使用ã�™ã‚‹è¨­å®šã�®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’指定ã�—ã�¾ã�™ã€‚指定ã�—ã�¦ã�„ã�ªã�„ã€�検証ルールを実行ã�—よã�†ã�¨ã�™ã‚‹ã�¨ã‚¨ãƒ©ãƒ¼ã�«ã�ªã‚‹ã�®ã�§ã€�ã�”注æ„�ã��ã� ã�•ã�„。

指定ã�®éš›ã�«ã�¯ã€�FormValidator::LazyWay::Rule:: ã�®éƒ¨åˆ†ã�¯çœ�ç•¥ã�§ã��ã�¾ã�™ã€‚ ã�¾ã�Ÿã€�独自ã�§ä½œæˆ�ã�—ã�Ÿæ¤œè¨¼ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã�®å ´å�ˆã�¯ã€�é ­ã�«+ã‚’ã�¤ã�‘ã‚‹ã�“ã�¨ã�§ã€�指定ã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�¾ã�™ã€‚

rules :
   - String
   - +OreOre::Rule

lang

デフォルト�使用�る言語を設定���。値�デフォルト�en��。

lang : ja

langs

使用ã�™ã‚‹è¨€èªžã‚’ã�™ã�¹ã�¦æŒ‡å®šã�—ã�¾ã�™ã€‚複数ã�®è¨€èªžã‚’使用ã�™ã‚‹ã‚µã‚¤ãƒˆã�®éš›ã�«è¨­å®šã�—ã�¾ã�™ã€‚ 複数ã�®è¨€èªžã‚’使用ã�—ã�ªã�„å ´å�ˆã�¯ã€�設定ã�™ã‚‹å¿…è¦�ã�¯ã�‚りã�¾ã�›ã‚“。

langs : 
   - ja
   - en

setting

検証ルール��を�フィールド��マッピング����。 以下�よ���フォーマット��り��。

レベル :
   フィールド� :
       設定� :
           設定����定義�れ�設定
レベル

��フィールド�����検証モジュールを指定��るよ���レベル���仕組���り��。 何も設定���れ��strict ���検証ルール�読�込�れ��。

例ã�ˆã�°emailã�¨ã�„ã�†ãƒ•ィールドã�Œã�‚ã�£ã�Ÿå ´å�ˆã�«ã€�登録時ã�®ãƒ•ォームã�§ã�¯strictレベルã�®æ¤œè¨¼ãƒ«ãƒ¼ãƒ«ã‚’ã€� 検索時ã�«ã�¯looseレベルã�®æ¤œè¨¼ãƒ«ãƒ¼ãƒ«ã‚’使用ã�—ã�Ÿã�„å ´å�ˆã�ªã�©ã€�ã��ã�†ã�—ã�Ÿéš›ã�«ä½¿ç”¨ã�™ã‚‹ã�“ã�¨ã�«ã�ªã‚Šã�¾ã�™ã€‚

setting :
   stcit : 
       email :
           rule :
               - Email#email
   loose :
       email :
           rule :
               - Email#much_alias

登録フォーム���strict ���指定を�る必���実行����。

my $res = $fv->check( $cgi , { required => [qw/email/] } );

検索フォーム���loose を使用�る���level �設定を使��使用���。

my $res = $fv->check( $cgi , { required => [qw/email/] , level => { email => 'loose' }   } );

���特別�スペシャルレベル�二��り��。 一��� regex_map ���スペシャルレベル��。 ��レベルを使用�る��正�表�をフィールド��使用�る�������。

setting :
   regexp_map :
       '_id$' :
           rule :
               - Number#integer
   strict :
       foo_id :
           rule :
               - Email#email
       

ã�“ã�®ã‚ˆã�†ã�«ã‚»ãƒƒãƒˆã�™ã‚‹ã�“ã�¨ã�«ã‚ˆã‚Šã€�_idã�§çµ‚ã‚�ã‚‹ã�™ã�¹ã�¦ã�®ãƒ•ィールドã�¯ã€�Number#integerã�®æ¤œè¨¼ãƒ«ãƒ¼ãƒ«ã�Œé�©å¿œã�•れã�¾ã�™ã€‚ ã�Ÿã� ã�—ã€�ä»–ã�®ãƒ¬ãƒ™ãƒ«ã�®è¨­å®šã�®æ–¹ã�Œå¼·ã�„仕様ã�«ã�ªã�£ã�¦ã�Šã‚Šã€�strict ã�§ foo_idを設定ã�—ã�Ÿå ´å�ˆã€�ã��ã�¡ã‚‰å�´ã‚’優先的ã�«å��æ˜ ã�•ã�›ã�¾ã�™ã€‚

二ã�¤ã‚�ã�¯ merge ã�¨ã�„ã�†ã‚¹ãƒšã‚·ãƒ£ãƒ«ãƒ¬ãƒ™ãƒ«ã�§ã�™ã€‚ ã�“ã�®ãƒ¬ãƒ™ãƒ«ã‚’使用ã�™ã‚‹ã�¨ã€�複数ã�®é …目をマージã�—ã�Ÿçµ�果を検証ã�«ä½¿ç”¨ã�™ã‚‹ã�“ã�¨ã�Œå‡ºæ�¥ã‚‹ã‚ˆã�†ã�«ã�ªã‚Šã�¾ã�™ã€‚

merge:
  date:
    format: "%04d-%02d-%02d"
    fields:
      - year
      - month
      - day
strict:
  date:
    rule:
      - Object#regexp:
          format: ^\d{4}-\d{2}-\d{2}

ã�“ã�®ã‚ˆã�†ã�«ã‚»ãƒƒãƒˆã�™ã‚‹ã�“ã�¨ã�«ã‚ˆã‚Šã€�year, month, day ã‚’ format ã�«å¾“ã�£ã�¦å…¥ 力内容をマージã�—ã�¦ date ã�¨è¨€ã�†é …目を作りã�¾ã�™ã€‚ ã�“ã�® date ã�¨ã�„ã�†é …ç›®ã�«ã�¯ã��ã�®ä»–ã�®é€šå¸¸ã�®é …ç›®ã�¨å�Œã�˜ã‚ˆã�†ã�«æ¤œè¨¼ã�™ã‚‹ã�“ã�¨ã�Œå‡º æ�¥ã�¾ã�™ã€‚

フィールド�

フィールド�を指定���。

設定�

ç�¾åœ¨ rule ã�¨ã�„ã�†è¨­å®šå��ã�Œã�‚りã€�ã�“ã�®é…�下ã�«ã�¯ã€�検証用モジュールã�®è¨­å®šã‚’書ã��ã�“ã�¨ã�Œã�§ã��ã�¾ã�™ã€‚ filter , merge , fix ã�¨ã�„ã�†è¨­å®šå��ã�®è¿½åŠ ã‚’ä»Šå¾Œã�«äºˆå®šã�—ã�¦ã�„ã�¾ã�™ã€‚

rule

フィールド��検証用モジュール�マッピングを�る設定��。以下�よ����列��検証用モジュールを複数指定�る�������。 ���検証用モジュール��引数を設定�る�������。 検証用モジュール���rules �指定��ナマエ��関数�を # �������より設定����。

rule :
   - String#length :
       min : 4
       max : 12
   - String#ascii 
   - +OreOre#rule

labels

フィールド��表示�を設定���。

labels :
   email     : メールアドレス
   user_name : ユーザ�
   user_id   : ユーザーID

messages

検証モジュール自身ã�«è¨­å®šã�•れã�¦ã�„ã‚‹ã€�メッセージã�«å†…容を上書ã��ã�™ã‚‹ã�®ã�«ä½¿ç”¨ã�§ã��ã�¾ã�™ã€‚ 特ã�«å•�題ã�ªã�„å ´å�ˆã�¯ã€�使用ã�™ã‚‹å¿…è¦�ã�¯ã�‚りã�¾ã�›ã‚“。言語ã�”ã�¨ã�«æŒ‡å®šã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã€� rule_messageã�§ã€�å¤§æž ã�®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã€� rule ã�§ã€�å�„検証モジュールã�®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’上書ã��ã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�¾ã�™ã€‚

messages :
    ja :
        rule_message : __field__��__rule__�使用����。
        rule :
            Email#email  : メイルアドレス
            String#length : $_[min]文字以上��$_[max]文字以下

Profile

check()メソッド�二�目�引数�入るデータを�profile�呼���。

required

å¿…é ˆé …ç›®ã‚’æŒ‡å®šã�—ã�¾ã�™ã€‚ã�“ã�“ã�§æŒ‡å®šã�•れã�Ÿãƒ•ィールドå��ã�Œå­˜åœ¨ã�—ã�ªã�„å ´å�ˆã€�missingエラーã�«ã�ªã‚Šã�¾ã�™ã€‚

my $profile 
   = {
       required => [qw/email name/],
   }

optional

å¿…é ˆã�§ã�¯ã�ªã��ã€�ã�‚ã�£ã�¦ã‚‚ã�ªã��ã�¦ã‚‚良ã�„フィールドå��を指定ã�—ã�¾ã�™ã€‚

my $profile 
   = {
       optional => [qw/zip/],
   }

defaults

フィールドå��ã�Œç©ºç™½ã� ã�£ã�Ÿå ´å�ˆã€�デフォルト値を設定ã�„ã�Ÿã�—ã�¾ã�™ã€‚requiredã�®ãƒ�ェックより先ã�«ã€� デフォルト値を設定ã�—ã�¾ã�™ã�®ã�§ã€�defaultsを設定ã�—ã�Ÿå ´å�ˆã€�入力ã�Œã�ªã��ã�¦ã‚‚ã€�å¿…é ˆæ�¡ä»¶ã‚’満ã�Ÿã�™ã�“ã�¨ã�Œã�§ã��ã�¾ã�™ã€‚

my $profile 
   = {
       required => [qw/email name/],
       defaults => {
           email => 'tomohiro.teranishi@gmail.com',
           name => 'Tomohiro',
       },
   }

want_array

一ã�¤ã�®ãƒ•ィールドã�«å¯¾ã�—ã�¦ã€�複数ã�®å€¤ã�Œé€�られã�¦ã��ã�Ÿå ´å�ˆã€�1ã�¤ç›®ä»¥å¤–を無視ã�™ã‚‹ã�®ã�§ã�™ã�Œã€�ã�“ã�®è¨­å®šã‚’ã�—ã�Ÿå ´å�ˆã€� 複数ã�®ãƒ•ィールドã�®å€¤ã‚’å�–å¾—ã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�¾ã�™ã€‚ã�¾ã�Ÿã€�é…�列ã�®å�‚ç…§ã�¨ã�—ã�¦å�–å¾—ã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�¾ã�™ã€‚

my $profile 
   = {
       required => [qw/email name/],
       optional => [qw/hobby/],
       want_array => [qw/hobby/],
   }

lang

言語設定を指定�る�������。���指定�る言語��設定�langs�指定�れ��る必���り��。

my $profile 
   = {
       required => [qw/email name/],
       lang => 'ja',
   }

level

検証レベルを変更ã�—ã�Ÿã�„å ´å�ˆã�«ä½¿ç”¨ã�—ã�¾ã�™ã€‚レベルã�¨ãƒ•ィールドå��ã�¨ã�®ãƒžãƒƒãƒ”ングã�¯ã€�設定ã�«ã�¦å®šç¾©ã�—ã�¦ã�„ã‚‹å¿…è¦�ã�Œã�‚りã�¾ã�™ã€‚

my $profile 
   = {
       required => [qw/email name/],
       level => {
           email => 'loose',
           name  => 'special',
       }
   }

�果

FormValidator::LazyWay::Resultオブジェクトを戻り値ã�¨ã�—ã�¦å�–å¾—ã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�¾ã�™ã€‚ã��ã�¡ã‚‰ã‚’å�‚ç…§ã�—ã�¦ã��ã� ã�•ã�„。

AUTHOR

Tomohiro Teranishi <tomohiro.teranishi@gmail.com>

1 POD Error

The following errors were encountered while parsing the POD:

Around line 3:

Non-ASCII character seen before =encoding in 'フォーム検証用モジュール'. Assuming CP1252