1

私はperlダンサーで単純なフォーム検証を行おうとしていますが、ダンサー/ perlで単純なパラメーター(たとえば、フィールドを空にすることはできません、電子メールの有効性、フィールドの最小長)を検証するための最良の方法は何でしょうか?追加のプラグインまたはCPANモジュール

これがこれまでのコードです

post '/register' => sub {

my $db = connect_db();
my $sql = 'insert into users (username, email, password, motivation) values (?, ?, ? ,?)';
my $sth = $db->prepare($sql) or die $db->errstr;
$sth->execute(params->{'username'}, params->{'email'},params->{'password'}, params->{'motivation'}) or die $sth->errstr;

set_flash('Hey you signed up !');
redirect '/thanks';
};

私はそれをグーグルで検索し、Form :: FooのようなCPANモジュールを使用して検証を行ういくつかの方法を見つけましたが、それなしでどのようにそれを行うのですか?

4

1 に答える 1

2

プラグインやCPANモジュールの使用を明示的に避けたい理由がわかりません-あなたが思いついたソリューションは、新しいコードなので勝ったことを除いて、プラグインやCPANモジュールと同じことをする可能性があります成熟してテストされているわけではありません。

最近、Dancerを使用して簡単なアプリを開発し始めました。CPANモジュールを使用してこの問題を解決する方法について説明します。もちろん、それを無視することもできます。

ユーザーを追加するためのルートハンドラーは次のようになります。

post '/user/add' => {
    my $args = valid_input('/user/add')
        or return template('user/add');
    my $user = User->new({
        username => $args->{username},
        # ...
    });
    user->insert;  # you'll probably want some error handling here
    set_flash('User added');
    redirect '/user';
};

このvalid_input関数は、CPANのData :: Form::Validatorモジュールを使用するアプリ用に作成したヘルパーです。引数は、使用する検証プロファイルの名前です。'/usr/add'簡単にするために、ルート名と同じままにすることにしました。

ドキュメントはかなり良いので、Data :: Form::Validatorの呼び出しの詳細については退屈しません。私が言及するのは、検証が失敗した場合、valid_inputヘルパーは検証エラーメッセージを保存してアラートボックスに表示し、送信されたパラメーターも保存することです。

my $q = params();  # need to force scalar context to get a hashref;
fill_in_form($q);  # save submitted parameters

保存された検証エラーメッセージをテンプレートで利用できるようにするbefore_template_renderフックがあります(実際にはでレンダリングされますviews/layouts/main.tt)。

また、保存された送信済みパラメーターを受け取り、 HTML::FillInFormモジュールafter_template_renderを使用してレンダリングされたHTMLフォームに戻すフックもあります。

そのインフラストラクチャが整っているので、すべてのフィールドが事前に入力された編集フォームで既存のユーザーレコードを表示するルートハンドラーは簡単です。

get '/user/:id' => sub {
    if( my $user = User->find( param('id') ) ) {
        fill_in_form($user);
        return template 'user/edit', { id => $user->id };
    }
    not_found "User not found";
};

UserinUser->find()は、私のアプリ固有のヘルパー関数の1つです。Dancer :: Plugin :: DBICモジュールを使用して、userテーブルの結果セットオブジェクトを返します。

私は必ずしもData::Form::Validatorの大ファンではないと言います。やりたいことはすべて達成できましたが、思った以上に手間がかかることもあります。

于 2012-09-10T03:36:35.313 に答える