Amon2で、MyApp::Web::Plugin::FormValidator::Liteを作ってみた。

なるべくコントローラに書く部分を少なくしたいのです。。
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も書かないといけませんが)バリデートができるようになりました。