C::P::FormValidator::Simple::Messagesというものを作った

mod_perlとCatalyst::Plugin::Form::Validator::Simple - spiritlooseのはてなダイアリー

僕も以前この方とまったく同じ症状になってその時は急いでたこともあり、ソース読むのも面倒だったんでmod_perlFastCGICatalystを走らせて難を逃れたんですが、最近またCatalystを使うことになりそうなんで根本解決すべくモジュールを作ってみました。

ソースはこちら

package Catalyst::Plugin::FormValidator::Simple::Messages;
use strict;
use warnings;

use base qw/Catalyst::Plugin::FormValidator::Simple/;
use Catalyst::Exception;
use YAML;

our $VERSION = '0.01';

sub setup {
    my $self = shift;
    $self->NEXT::setup(@_);
    my $setting = $self->config->{validator} || {};
    
    return unless exists $setting->{messages};
    return if ref $setting->{messages} eq 'HASH';
    
    if ( -e $setting->{messages} && -f _ && -r _ ) {
        eval {
            $setting->{messages} = YAML::LoadFile( $setting->{messages} );
        };
        Catalyst::Exception->throw( message => __PACKAGE__ . qq/: $@/ ) if $@;
    }
}

sub form {
    my $c = shift;
    if ($_[0]) {
        my $setting = $c->config->{validator} || {};
        $c->{validator}->set_messages($setting->{messages})             if exists $setting->{messages};
        $c->{validator}->set_message_format($setting->{message_format}) if exists $setting->{message_format};
    }
    $c->NEXT::form(@_);
}

1;

基本的な解決方法として元記事の1番のやり方でやるわけですが、元記事の方も懸念しているようにYAML::Loadが何度も呼ばれてしまうので、一度しか呼ばれないようにsetupで予めLoad処理しちゃって$c->configを上書きするようにしました。

であとはformメソッドを呼び出すタイミングでset_messagesを呼ぶようにしました。

C::P::FormValidator::Simpleから派生しているのでMyAppに追加する際は

use Catalyst qw/
      :
      :
    FormValidator::Simple::Message
      :
/;

だけでOKです。

C::P::FormValidator::Simple::Autoと一緒に使用しても問題なく動きます。継承順は

use Catalyst qw/
      :
      :
    FormValidator::Simple::Message
    FormValidator::Simple::Auto
      :
/;

という感じになりますかね。

ちなみに1つのCatalystアプリケーションしか走らせないケースでは今まで通りC::P::FormValidator::Simpleを使うのが良いかと思います。

後でCPANにうpります。

Catalyst::Plugin::FormValidator::Simple::Messages-v0.01