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::*使えって書いてあった。これ直そう。