CatalystでFormValidator::SimpleをPluginにせずに使う

Catalyst::Plugin::FormValidator::Simpleは使ってもいいような空気に見えるけど、試しにPluginから外してみる。それとも皆C::P::FV::S::Autoなの? あっちは確かにPluginでないと意味がない。

MyApp::Controller::Base

use FormValidator::Simple;
sub validate {
    my $self = shift;
    my $req  = shift;
    FormValidator::Simple->check( $req => [ @_ ] );
}

MyApp::Controller::Root

use parent qw(TMCourse::Controller::Base);
sub auto : Private {
    my ( $self, $c ) = @_;
    FormValidator::Simple->set_message_decode_from( 'utf-8' );
    FormValidator::Simple->set_message_format( Encode::decode( 'utf-8', $c->config->{ validator }{ message_format } ) );
    FormValidator::Simple->set_messages( $c->config->{ validator }{ messages } );
    return 1;
}

MyApp::Controller::Login

use parent qw(TMCourse::Controller::Base);
sub index : Path {
    my ( $self, $c ) = @_;

    my $form = $self->validate( $c->req,
        username => [qw/NOT_BLANK ASCII/],
        password => [qw/NOT_BLANK ASCII/],
    );
}

Pluginとの使用感の主な相違点は2つ。

  • $c->req非依存なので好きな物に対してvalidateをかけられる

ただし、それが嬉しいかどうかは微妙。最初はvalidateをPrivateActionとして実装して、$c->forward( 'validate', ... ) で呼んでたけど、今は非依存にしてみてる。

  • set_message_formatにdecodeをはさんだ

FormValidator::SimpleはPODにもあるように、

FormValidtor::Simple->set_mesasges_decode_from('utf-8');

すると、messageを自動でdecodeしてくれるけど、message_formatはdecodeの対象になっていないので、そこにマルチバイト文字が入るとうまくいかない。そこで、configを読み込む時に手動でフォロー。まぁ、おまけ。


今のところControllerに条件書いちゃってるけど、MyApp::Serviceとかの層に持たせて、Controllerはそれを呼び出すだけとかにした方がいいな。MyApp::Schema::Hogeにバリデーション書くとフォームに対する柔軟性が無くなるけど、もう一層かませば問題なさげ。

# ExtendingCatalystにMyApp::Controller::BaseじゃなくてMyApp::Base::Controller::*使えって書いてあった。これ直そう。