Mojolicious模板渲染(十二)

一、表单验证

Mojolicious::Plugin::DefaultHelpers模块中的helper”validation”,可以对POST或GET方法发来的参数进行验证。默认情况下,所有未知字段都将被忽略,因此在对它们的值执行检查之前,您必须决定哪些字段是必需的,哪些是可选的。如果使用像Mojolicious::Validator:: validation中的“is_valid”等方法,每个检查都会立即执行,因此可以立即使用结果构建更高级的验证逻辑:

use Mojolicious::Lite -signatures;

get '/' => sub ($c) {

  # 如果提交了参数,就进行检查
  my $v = $c->validation;
  return $c->render('index') unless $v->has_data;

  # 验证参数 ("pass_again" 依赖于 "pass")
  $v->required('user')->size(1, 20)->like(qr/^[a-z0-9]+$/);
  $v->required('pass_again')->equal_to('pass')
    if $v->optional('pass')->size(7, 500)->is_valid;

  # 检查如果验证失败
  return $c->render('index') if $v->has_error;

  # 返回确认信息
  $c->render('thanks');
};

app->start;

#下文中label_for是标签指html中的label标签,=>后引号中的字符串会完整的显示在form中。括号中的文本是验证条件说明。与上文中的验证代码语句一一对应。

__DATA__

@@ index.html.ep
<!DOCTYPE html>
<html>
  <head>
    <style>
      label.field-with-error { color: #dd7e5e }
      input.field-with-error { background-color: #fd9e7e }
    </style>
  </head>
  <body>
    %= form_for index => begin
      %= label_for user => 'Username (required, 1-20 characters, a-z/0-9)'
      <br>
      %= text_field 'user', id => 'user'
      %= submit_button
      <br>
      %= label_for pass => 'Password (optional, 7-500 characters)'
      <br>
      %= password_field 'pass', id => 'pass'
      <br>
      %= label_for pass_again => 'Password again (equal to the value above)'
      <br>
      %= password_field 'pass_again', id => 'pass_again'
    % end
  </body>
</html>

@@ thanks.html.ep
<!DOCTYPE html>
<html><body>Thank you <%= validation->param('user') %>.</body></html>

Mojolicious::Plugin::TagHelpers模块中的标签helper生成form表单,会自动的记录之前填写的值。除此之外,它还引用了field-with-error css样式,当验证失败时会自动显现。这是tag helper渲染后的html:

<label class="field-with-error" for="user">
  Username (required, only characters e-t)
</label>
<input class="field-with-error" type="text" name="user" value="sri">

有关可用检查的完整列表,请参见Mojolicious::Validator中的“CHECKS”。

标签