The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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