Я пытаюсь выполнить простую проверку формы в 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';
};
Я сделал это в Google и нашел несколько способов сделать проверку с использованием модулей CPAN, таких как Form :: Foo, но как это сделать без этого?
1 ответ
Я не уверен, почему вы хотели бы прямо отказаться от использования плагина или модуля 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
- это помощник, который я создал для своего приложения, которое использует Data :: Form :: Модуль валидатора от CPAN. Аргумент '/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
).
У меня также есть ловушка after_template_render
, которая берет сохраненные отправленные параметры и помещает их обратно в визуализированную HTML-форму с помощью HTML :: FillInForm.
Поскольку у меня есть эта инфраструктура, обработчик маршрута для отображения существующей записи пользователя в форме редактирования со всеми предварительно заполненными полями является тривиальным:
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
в User->find()
- еще одна из моих вспомогательных функций для конкретных приложений. Он использует модуль Dancer :: Plugin :: DBIC для возврата объекта набора результатов для моего user
таблица.
Я скажу, что я не обязательно большой поклонник Data :: Form :: Validator. Мне удалось добиться всего, чего я хотел, но иногда кажется, что это требует больше работы, чем мне хотелось бы.
Похожие вопросы
Новые вопросы
perl
Perl - это процедурный высокоуровневый динамический язык программирования общего назначения, известный своей собственной поддержкой регулярных выражений и возможностей синтаксического анализа строк. Пожалуйста, используйте этот тег для вопросов о Perl в целом. Для вещей, связанных с новым (но связанным) языком Raku (ранее «Perl 6»), используйте тег raku. Для регулярных выражений в стиле Perl на других языках используйте тег regex или, если они основаны на библиотеке PCRE, тег pcre.
errors << 'message here'
в Perl вы можете сказатьadd_error('message here')
и определить вспомогательную функциюadd_error
для отправки сообщений в глобальный массив. В конечном итоге это то, что делает Data :: Form :: Validator, но более структурированным и многоразовым способом (например: у него есть правило для адресов электронной почты, поэтому вам не нужно регулярное выражение). Также, на мой взгляд, это упрощает логику наличия одного помощника, который возвращает полный набор действительных входных данных или вообще ничего.