如何实现Mojolicious过滤器并引发错误消息?

时间:2017-05-06 14:34:03

标签: perl mojolicious

我有这个过滤器:

use Net::IP;

sub create_inet {
    my( $self, $name, $value ) =  @_;

    $self->error( $name => [ 'create_inet', 'Bad INET', Net::IP::Error ] ), return
       unless my $ip =  Net::IP->new( $value );

    return $ip;
}

我将这个添加到我的应用程序中

$app->validator->add_filter( inet => \&create_inet );

在控制器的操作中,我会检查

$c->validation->required( 'subnet', 'inet' );

但是当subnet的值以错误的格式提供时,我会收到错误required而不是预期的Bad INET

错误被覆盖in Mojolicious::Validator::Validation

如果提供的数据格式错误,如何实现这样的过滤器并引发错误?


更新

Mojolicious应用在此问题中有两件我感兴趣的事情:

  • 过滤
  • 检查

filter适用于{ input }值,并在格式化后将其放入{ output }。例如,请查看trim filter

checker只检查参数的有效性,并在必要时引发错误。

在我的方法中,我想将输入值转换为对象:'1.2.3.4/32' -> Net::IP。因此$self->param( 'subnet' )将返回Net::IP对象

我有两个选择:

$self->required( 'subnet' )->inet;   #First
$self->required( 'subnet', 'inet' ); #Second (described in question)

在我看来,第一个会破坏封装,因为output是直接更改的:

$app->validator->add_check( inet => \&create_inet );

use Net::IP;

sub create_inet {
    my( $self, $name, $value ) =  @_;

    return Net::IP::Error
        unless my $ip =  Net::IP->new( $value );

    $self->output->{ $name } =  $ip; # Will this broke encapsulation?
    return;
}

在第二种情况下,错误消息将丢失。

0 个答案:

没有答案