use Mojo:: Base 'Mojolicious::Plugin' ;
use common:: sense ;
my %VALIDATORS = (
login_form => \&_validate_login_form ,
# ...
) ;
sub register {
my ( $plugin , $app ) = @_ ;
# clean value (only digit)
$app -> validator -> add_filter ( digit_only => sub {
my ( $vd , $name , $value ) = @_ ;
$value =~ s/[^0-9]+//g ;
}
) ;
$app -> validator -> add_filter ( double_pg => sub {
my ( $vd , $name , $value ) = @_ ;
$value =~ s/,/./g ;
}
) ;
$app -> helper ( _validate_it => sub {
my ( $self , $form ) = @_ ;
my $v = $self -> validation ;
my $out = $VALIDATORS { $form } ( $v ) ;
}
) ;
}
###
sub _validate_login_form {
$validation -> required ( 'email' ) ;
$validation -> required ( 'password' ) ;
say for @ { $validation -> failed } ;
}
#...
1 ;
##
use Mojo:: Base 'Mojolicious::Controller' ;
sub signin {
my $validation = $s -> _validate_it( 'login_form' ) ;
return $s -> redirect_to ( '/' ) if $validation -> has_error ; # $vars is hashref with params
my $vars = $validation -> output ;
#... cut here ...
}
cGFja2FnZSBSVjo6UGx1Z2luOjpWYWxpZGF0ZTsKdXNlIE1vam86OkJhc2UgJ01vam9saWNpb3VzOjpQbHVnaW4nOwp1c2UgY29tbW9uOjpzZW5zZTsKCm15ICVWQUxJREFUT1JTID0gKAogICAgICAgICAgICAgICAgICBsb2dpbl9mb3JtICAgICAgICA9PiBcJl92YWxpZGF0ZV9sb2dpbl9mb3JtLAogICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgICAgICAgICAgICk7CgpzdWIgcmVnaXN0ZXIgewogIG15ICgkcGx1Z2luLCAkYXBwKSA9IEBfOwoKICAjIGNsZWFuIHZhbHVlIChvbmx5IGRpZ2l0KQogICRhcHAtPnZhbGlkYXRvci0+YWRkX2ZpbHRlciggZGlnaXRfb25seSA9PiBzdWIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoJHZkLCAkbmFtZSwgJHZhbHVlKSA9IEBfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPX4gcy9bXjAtOV0rLy9nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgCiAgJGFwcC0+dmFsaWRhdG9yLT5hZGRfZmlsdGVyKCBkb3VibGVfcGcgPT4gc3ViIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCR2ZCwgJG5hbWUsICR2YWx1ZSkgPSBAXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID1+IHMvLC8uL2c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAKICAkYXBwLT5oZWxwZXIoIF92YWxpZGF0ZV9pdCA9PiBzdWIgewogICAgICAgICAgICAgICAgICBteSAoJHNlbGYsICRmb3JtKSA9IEBfOwogICAgICAgICAgICAgICAgICBteSAkdiA9ICRzZWxmLT52YWxpZGF0aW9uOwogICAgICAgICAgICAgICAgICBteSAkb3V0ID0gJFZBTElEQVRPUlN7JGZvcm19KCR2KTsKICAgICAgICAgICAgICAgICAgcmV0dXJuICRvdXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICk7ICAKICB9CgojIyMKc3ViIF92YWxpZGF0ZV9sb2dpbl9mb3JtIHsKICBteSAkdmFsaWRhdGlvbiA9IHNoaWZ0OwogICR2YWxpZGF0aW9uLT5yZXF1aXJlZCgnZW1haWwnKTsKICAkdmFsaWRhdGlvbi0+cmVxdWlyZWQoJ3Bhc3N3b3JkJyk7CiAgc2F5IGZvciBAeyR2YWxpZGF0aW9uLT5mYWlsZWR9OwogIHJldHVybiAkdmFsaWRhdGlvbjsKfQoKIy4uLgoKMTsKCiMjIApwYWNrYWdlIFJWOjpDb250cm9sbGVyOjpMb2dpbjsKdXNlIE1vam86OkJhc2UgJ01vam9saWNpb3VzOjpDb250cm9sbGVyJzsKCnN1YiBzaWduaW4gewogIG15ICRzID0gc2hpZnQ7CiAgCiAgbXkgJHZhbGlkYXRpb24gPSAkcy0+X3ZhbGlkYXRlX2l0KCdsb2dpbl9mb3JtJyk7CiAgCiAgcmV0dXJuICRzLT5yZWRpcmVjdF90bygnLycpIGlmICR2YWxpZGF0aW9uLT5oYXNfZXJyb3I7CiAgIyAkdmFycyBpcyBoYXNocmVmIHdpdGggcGFyYW1zCiAgbXkgJHZhcnMgPSAkdmFsaWRhdGlvbi0+b3V0cHV0OwogICMuLi4gY3V0IGhlcmUgLi4uCn0KCg==