第一回 Catalyst::Plugin::FormValidator::Lazy 勉強

C::P::FormValidaor::Lazyというモジュールの紹介と使い方をまとめていこうと思います。

取得方法

残念ながら、CPANには上げてないので、

http://tomyhero-perl-module.googlecode.com/svn/trunk/Catalyst-Plugin-FormValidator-Lazy/

ここから取得して下さい。

メーリングで質問したら、Controllerとして実装するべきと言われたので、それを実装してみたが、
実際、コントローラごとにconstraintsを設定するのではなく、アプリ全体なので、微妙だったので、やめた。他にも問題があったし。

で、上げにくくなったので、ローカルにいます。

作成理由

毎フォームごとに、フォマットの規則を設定するのが邪魔臭くて作成しモジュール。
例。

sub foo : Local {

 $c->form({
    required => [qw/id/],
    constraints => {
       id => qr/\d+$/,
    }
 });
}

sub boo : Local {

 $c->form({
    required => [qw/id/],
    constraints => {
       id => qr/\d+$/,
    }
 });
}

Catalyst::Plugin::FormValidatorだと、
同じidのフォーマットなのに、2回かくのがウッと惜しい。これが、作成理由でした。

使ってみよう

猫アプリ(らくだ本のような感じで呼びたい。)を用意しました。第一回は、郵便番号のフォーマットチェッカー
を作成します。

サンプルのダウンロード

このサンプルは、更新していく予定。今は、第一回分だけのコード。
http://tomyhero-perl-module.googlecode.com/svn/trunk/Sample/Neko-Web/

解説

動くようにする為に

まず、プラグインを読み込みます。

Neko::Web.pm

use Catalyst qw/
    -Debug 
    ConfigLoader 
    Static::Simple
    FormValidator::Lazy
/;
バリデーション用モジュールを作成します。

とりあえず、中身は気にしないでください。

Neko::Validator ですね。中身は空です。

設定を行います。
form_validator_lazy :
    # ここで検証用モジュールをセットします。
    method_pkg : Neko::Validator
    strict :
        # post_code のフォーマットを正規表現で指定します。
        post_code : '^\d{3}-\d{4}$'
コントーローラの説明

constrainsを記入していないところがポイントです。
設定ファイルから自動的に読み込みセットしています。

sub zip01_do : Private {
    my ( $s ,$c ) = @_;

    
    $c->form({
        required => [qw/post_code/],
    });

    if( $c->has_dfv_error ) {
        return ;
    }

    $c->stash->{template} = 'zip01_do.tt';

}
エラーがおこった時

has_dfv_error という関数が用意されています。これは、DFVのエラーがおこると真を返します。
ですので、これでエラーしょりができます。

    if( $c->has_dfv_error ) {
        return ;
    }

また、missing ,invalid は自動的に、stashにハッシュでセットされます。ですので、
DFVエラーがおこった際、テンプレートですぐに使えます。

root/zip01.tt

[% IF c.has_dfv_error %]

<div style="color:red;margin:10">
    [% IF missing.post_code %]郵便番号を入力して下さい。</br>[% END %]
    [% IF invalid.post_code %]郵便番号のフォーマットが不正です。</br>[% END %]
</div>

[% END %]
検証がOKだった場合

$c->stash->{v} に $c->form->{valid}の値が入ります。ですので

郵便番号 : [% v.post_code %]

こういう風に使うことができますね。

動かして確かめよう
 ./script/neko_web_server.pl -k
まとめ

Data::FormValidator , Catalyst::Plugin::FormVdalidator を使用したことがないと意味が分からないかもしれない。