我有这个过滤器:
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;
}
在第二种情况下,错误消息将丢失。