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も書かないといけませんが)バリデートができるようになりました。