CatalystでFormValidator::Liteを使ってみたかったので
やってしまいました。
→GitHub - taiyoh/catalyst-model-formvalidator-lite: I want to use FV::Lite in Catalyst
Catalyst::Model::Data::Localizeの動きを意識して、PluginではなくModelで動かすようにして、あとはリクエストごとにインスタンスを生成するようにしたかったので、Catalyst::Component::InstancePerContextの動きを再現(コピペともいう)してます。
設定は
<validator> profile __path_to(conf/myapp_form.yml)__ constraints Default constraints Email constraints URL constraints +MyApp::SelfRule </validator>
こんな感じで。profileで指定するファイルは、Catalyst::Plugin::FormValidator::Simple::AutoのYAML構造と互換性があります。バリデーションメソッドの名前さえ注意すれば問題なし。今気づいたけどこのモジュール、今の段階だと、profileでファイル指定しないと色々起きるな…。(対応済)
sub validation_test : Local { my ( $self, $c ) = @_; my $form = $c->model('Validator'); if ( my $year = $c->req->param('year') ) { my $ref_year = DateTime->now->set_time_zone('Asia/Tokyo')->year; $form->set_error( date_year => 'YEAR_OUTRANGE' ) if $year < $ref_year || $ref_year + 3 < $year; } return !$form->has_error; }
使い方はこんな感じ。has_errorメソッドの実行のタイミングでバリデーションチェックが始まります。ほか、AUTOLOADを使ってるので、$c->model('Validator')から直でFV::Liteのメソッドを呼べます。
バリデーションルール追加のメソッドとかもあるけど、それは$c->config->{profile}がないときの対応がまだだからなぁ…
(追記)
今しがたのコミットで、ファイルがなくても動作するようにしました。また、
sub validation_test2 : Local { my ( $self, $c ) = @_; my $form = $c->model('Validator', [ text => [ 'NOT_BLANK' ], color => [ qw/NOT_BLANK INT/ ] ]); $form->set_message({ 'color.int' => 'must be int' }); return !$form->has_error; }
こんな書き方にも対応。なので、バリデーションルール追加のメソッドはこちらに統合で。
てか、帰り道にふと思ったけど、FV::Lite->checkのタイミングって、has_errorメソッドに合わせなくていいよな…、JK。ということなので、これもコミットしたので、$form->valid($key)を実装するための準備が整いましたとさ。