C::P::FV::S::Aを使ってる時にFV::S::P::DBIC::Uが使えない?件

タイトルは「Catalyst::Plugin::FormValidator::Simple::Autoを使ってる時にFormValidator::Simple::Plugin::DBIC::Uniqueが使えない?件」です。

長いので短くしてみました。

使えないというかどうやって使うのかがわからないというのが正解なんですが、FVS::Auto使って

 zip:
   - rule: [ 'NOT_DBIC_UNIQUE' , 'MyApp::Model::DBIC::Zipcode' , 'zip']
     message: 存在しない郵便番号です

みたいに書いてもFVS::P::DBIC::Uniqueエラーになっちゃいます。

Catalystが内部で保持しているmodel(ResultSet)オブジェクトを利用したいのですが現状のままじゃ無理ぽい?

myapp.yamlでパスに変換してくれる特殊構文「__path_to()__」みたいなノリでmodelオブジェクトに変換されたりすると便利だと思ったんだけどどうでしょ。

 zip:
   - rule: [ 'NOT_DBIC_UNIQUE' , '__c_model(DBIC::Zipcode)__' , 'zip']
     message: 存在しない郵便番号です

こんな感じ。

というわけで作ってみました。

ネーミングはとりあえずCatalyst::Plugin::FormValidator::Simple::Auto::Model。

package Catalyst::Plugin::FormValidator::Simple::Auto::Model;
use strict;
use warnings;

our $VERSION = '0.01';

sub setup_components {
    my $c = shift;
    $c->NEXT::setup_components(@_);

    if ( my $profiles = $c->config->{validator}{profiles} ) {
        for my $action ( keys %$profiles ) {
            for my $name ( keys %{$profiles->{$action}} ) {
                for my $types ( @{$profiles->{$action}->{$name}} ) {
                    next unless ref $types;
                    next unless $types->[0] =~ /^(?:NOT_)?(?:DBIC|CDBI)/;
                    for my $val ( @$types[1..@$types-1] ) {
                        if ( $val =~ /^__c_model\((.*)\)__$/ ) {
                            my $model = $1;
                            $val = $c->model($model);
                        }
                    }
                }
            }
        }
    }
}

1;

setupじゃなくてsetup_componentsにしたのはsetupだとまだmodelオブジェクトが生成されてなかったから。

今のところ念ためにvalidatorのタイプ名がDBICCDBIで始まるものだけを変換するようにしてます。

作ったもののを実はちゃんとしたやりかたあったりして^^;