Mojolicious純正のフォームバリデーション & フィルター

Mojolicious純正のフォームバリデーション & フィルター

Mojolicious::Validator::Validation - Perform validations - metacpan.org

Mojolicious純正のフォームバリデーションを使う上で気を付ける点を書き留めておく。Mojolicious::Plugin::TagHelpersとも相性良いし(当たり前)、活用すべき。

my $validation = $c->validation;
$validation->required('name')->like(qr/hoge/);
$validation->optional('name2', 'trim')->like(qr/hoge2/);

バリデーション

required()又はoptional()から始める

$validation->required('name')又は$validation->optional('name')から始める。メソッドチェーンでもいいし、都度バリデーションメソッドを呼んでも良い。

  • requidedかoptionalを呼んだ時点でバリデーション対象のfieldが切り替わる。
  • 現在バリデーション対象になっているfieldは$validation->topicで取得できる。

filterはrequired()又はoptional()の第2引数以降で指定する

※ Mojolicious v6.41以降

$validation->required( 'name', 'filter1', 'filter2', ... );
$validation->optional( 'name', 'filter1', 'filter2', ... );

DB等へ保存する値は$validation->outputの値を使う

$c->req->paramsの値はリクエスト時の値なのでDB等に値を保存する場合には使用しない。

  • 特にfilterを使う場合は注意が必要。
  • filter適用後の値は$validation->outputに収納されている。
my $hash_ref = $validation->output;
my $value = $hash_ref->{name};

my $scalar = $validation->param('name');
my $array_ref = $validation->every_param('name');

フィルター

フィルインフォーム

タグヘルパーを使うとfill-in formしてくれるけど、値にフィルターを適用する場合は注意が必要。

  • バリデーション実行時に$c->param()でリクエストパラメータの値の書き換えが必要。
    • タグヘルパーの値補完にはreq->paramの値が使われる
バリデーションも同時に行っている場合

バリデーションエラーがあるとvalidation->param()がundefを返すのでバリデーションエラーがない時だけ書き換える...としなくてはならない。

my $validated_email_value = $c->validation->param('email');
$c->param( email => $validated_email_value ) if $validated_email_value;

独自のバリデーションを追加する

$validation->validator->add_check( name => sub {} )

独自のフィルターを追加する

$validation->validator->add_filter( name => sub {} )