我不确定您为什么要明确避免使用插件或 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";
};
User
inUser->find()
是我的另一个特定于应用程序的帮助函数。它使用Dancer::Plugin::DBIC模块为我的user
表返回一个结果集对象。
我会说我不一定是 Data::Form::Validator 的忠实粉丝。我已经能够实现我想要的一切,但有时它似乎需要比我想要的更多的工作。