2011-03-06 6 views
5

私はMoose(およびCatalyst)を使用するように従来のアプリケーションを変換していますが、次の質問があります。Perl Moose - 変数がMooseデータ型であるかどうかを確認します。

ユーザーが入力するデータの種類を決定するにはどうすればよいですか?

以下の非常に基本的な「検証」方法を使用して、粗い例題Iは複数のクエリを提出し、予想されるフォームフィールド 'id'、 'name'および 'email'に対してデータを検証します。

use MooseX::Declare; 
class CheckFields 
{ 
    #has '_field' => (is => 'rw', isa => 'Any'); 

    # Fields on form and type to which they must match. 
    method fields() 
    { 
     return [ { name => 'id', type => 'Int' }, 
       { name => 'name', type => 'Str' }, 
       { name => 'email', type => 'Email' } 
       ]; 
    } 

    # Dummy form posted requests. 
    method queries() 
    { 
     return [ { 'id' => 1, 
        'name' => 'John Doe', 
        'email' => '[email protected]' 
       }, 
       { 'id' => 'John Doe', 
        'name' => 1, 
        'email' => 'john.at.doe.net' 
       } 
       ]; 
    } 

    method validate_fields() 
    { 
     my $fields = $self->fields(); 

     # Loop through dummy form post requests 
     foreach my $query (@{ $self->queries }) 
     { 
      # Validate each field in posted form. 
      foreach my $field (@{ $fields }) 
      { 
       my $type = $field->{'type'}; 
       my $name = $field->{'name'}; 

       my $res = $self->validate->{ $type }($query->{ $name}); 
       print "$name is $res\n"; 
      } 
      print "\n"; 
     } 
    } 

    # Very basic, slightly crude field validation. 
    method validate() 
    { 
     return { 'Int' => sub { my $val = shift; return $val =~ /^\d+$/ ? "ok" : "not ok" }, 
       'Str' => sub { my $val = shift; return $val =~ /^[a-zA-Z\s]+$/ ?"ok" : "not ok" }, 
       'Email' => sub { my $val = shift; return $val =~ /^(.+)\@(.+)$/ ?"ok" : "not ok" } 
       }; 
    } 
} 

#!/usr/bin/perl 
use Moose; 
use CheckFields; 

CheckFields->new()->validate_fields(); 

1; 

はこのような何かをすることが可能です...このコードは単純に実行するテストするには、どこのセットアップ「どれ」...

has '_validate_field' => (is => 'rw', isa => 'Any'); 
に設定ISAで変数を

...次のように特定のタイプをテストしますか?

$self->validate_field(1); 
print $self->validate_field->meta->isa('Int') ? 'Int found' : 'Int not found'; 

$self->validate_field('ABC'); 
print $self->validate_field->meta->isa('Int') ? 'Int found' : 'Int not found'; 

EDITは、事前にありがとう:@bvr - 返信に時間を割いてくれてありがとう、私はそうMooseX ::のparamsの使用::検証が可能性がありますMOOSEするのは比較的新しいですよく私が探しているものではありませんが、最終的な解決策になります。私の意図は、検証の失敗を全体として報告するのではなく、エラーのある特定のフィールドをそれぞれ報告することです。その目的のために、isaを「Any」に設定したデフォルトの、ムースフレンドリーな入力ホルダーを定義できると考えました。次に、データが特定の型(Int、Str、または私によって定義されたいくつかのカスタマイズされた型)に準拠しているかどうかを確認するために 'eval'

"$ self-> validate_field-> meta-> isa( 'Int')..."参照は、C/C++の共用体の行に沿ったもので、変数さまざまな種類のものがあります。この例では、データが特定のデータ型に適合しているかどうかをテストしようとしています。

答えて

2

私はあなたの質問の最後の部分をかなりフォローしているかどうかはわかりませんが、最初の例ではMooseX::Params::Validateの使用が有効です。

編集:私の提案を評価するためにコードを作成しました。私が見ることができる

use MooseX::Declare; 
class CheckFields { 

    use Moose::Util::TypeConstraints; 
    use MooseX::Params::Validate; 
    use Try::Tiny; 
    use Data::Dump qw(pp); 

    subtype 'Email' 
     => as 'Str' 
     => where {/^(.+)\@(.+)$/}; 

    method fields() { 
     return [ 
      id => {isa => 'Int'}, 
      name => {isa => 'Str'}, 
      email => {isa => 'Email'}, 
     ]; 
    } 

    method queries() { 
     return [ 
      { 'id' => 1, 
       'name' => 'John Doe', 
       'email' => '[email protected]' 
      }, 
      { 'id' => 'John Doe', 
       'name' => 1, 
       'email' => 'john.at.doe.net' 
      } 
     ]; 
    } 

    method validate_fields() { 
     my $fields = $self->fields(); 

     foreach my $query (@{$self->queries}) { 
      try { 
       my (%params) = validated_hash([%$query], @{$fields}); 
       warn pp($query) . " - OK\n"; 
      } 
      catch { 
       warn pp($query) . " - Failed\n"; 
      } 
     } 
    } 
} 

package main; 

CheckFields->new()->validate_fields(); 

他のアプローチは、データ用のムースクラスを作る(検証がこの方法を含む)およびインスタンスが検証エラーなしで作成することができるかどうかを確認することです。

+0

私はMooseX :: Params :: Validateを使っているので、私は比較的新しいものです探している。 – user647248

+0

@ user647248 - ここに2つのメモがあります。まず、例外を検査して、どのフィールド検証が失敗したかを調べることができます。第二に、 'MooseX :: Params :: Validate'で概説された手法は、値を個別にチェックするように簡単に変更することができます。 – bvr

+0

+1カスタムタイプのプロジェクトをテストするには良い方法です。 –

関連する問題