Amon2で、MyApp::Web::Plugin::FormValidator::Liteを作ってみた。
2014年8月2日
なるべくコントローラに書く部分を少なくしたいのです。。
WAFはAmon2使ってます。
設定周り
まずは、configにバリデート内容を書いていきます。
+{ 'FormValidator::Lite' => +{ 'user' => { 'message' => { 'name.not_null' => '', }, 'param' => { 'name' => '名前', 'age' => '年齢', }, 'function' => { 'not_null' => '[_1]を入力してください', 'int' => '[_1]は数字で入力してください' }, 'check' => [ 'name' => [ qw/NOT_NULL/ ], 'age' => [qw/INT/], ] } }, };
MyApp::Web::Plugin::FormValidator::Lite
名前空間がまんまですが、中身はFormValidator::Liteです。
package MyApp::Web::Plugin::FormValidator::Lite; use strict; use warnings; use utf8; use Amon2::Util; use FormValidator::Lite; # $c->validator()を追加 sub init { my ( $self, $c ) = @_; Amon2::Util::add_method($c, 'validator', \&_validator); } # $c->validator()で呼ばれる中身 # $formは、configに書いた'user'を呼ぶ為の引数。 sub _validator { my ( $c, $form ) = @_; my $message = $c->config->{'FormValidator::Lite'}->{ $form }; my $check = $message->{'check'}; my $v = FormValidator::Lite->new( $c->req ); $v->set_message_data( $message ); my $res = $v->check( @{ $check } ); if ( $v->has_error ) { # エラーメッセージを分離 my $error_message = {}; for my $p ( keys %{ $message->{'param'} } ) { next unless ( exists $v->get_error_messages_from_param( $p )->[0] ); $error_message->{ $p } = $v->get_error_messages_from_param( $p )->[0]; } return { is_ok => 0, error_message => $error_message, }; } return { is_ok => 1 }; } 1;
Pluginを追加
MyApp::Webで追加します。
package MyApp::Web; # load plugins __PACKAGE__->load_plugins( '+MyApp::Web::Plugin::FormValidator::Lite', );
使ってみる
コントローラから$c->validator()を呼びます。
package MyApp::Web::C::Root; sub user { my ( $class, $c ) = @_; my $res = $c->validator('user'); unless ( $res->{'is_ok'} ) { return $c->render('error.tt', $res->{'error_message'} ); } return $c->render('user.tt',{}); }
こんな感じで、コントローラに数行追加するだけで(configも書かないといけませんが)バリデートができるようになりました。