1

我正在尝试在 perl dancer 中进行简单的表单验证,但我想知道在没有任何参数的情况下在 dancer/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';
};

我用谷歌搜索了它,发现了几种使用 CPAN 模块(如 Form::Foo)进行验证的方法,但是没有它怎么办?

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()是我的另一个特定于应用程序的帮助函数。它使用Dancer::Plugin::DBIC模块为我的user表返回一个结果集对象。

我会说我不一定是 Data::Form::Validator 的忠实粉丝。我已经能够实现我想要的一切,但有时它似乎需要比我想要的更多的工作。

于 2012-09-10T03:36:35.313 回答