Skip to content

Commit

Permalink
improved Mojolicious::Validator::Validation to allow custom validatio…
Browse files Browse the repository at this point in the history
…n errors
  • Loading branch information
kraih committed Dec 10, 2013
1 parent f975a45 commit 1746449
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 11 deletions.
4 changes: 3 additions & 1 deletion Changes
@@ -1,5 +1,7 @@

4.60 2013-12-07
4.60 2013-12-11
- Improved Mojolicious::Validator::Validation to allow custom validation
errors.

4.59 2013-12-04
- Added CSRF protection support.
Expand Down
25 changes: 15 additions & 10 deletions lib/Mojolicious/Validator/Validation.pm
Expand Up @@ -31,9 +31,7 @@ sub check {
my $input = $self->input->{$name};
for my $value (ref $input eq 'ARRAY' ? @$input : $input) {
next unless my $result = $self->$cb($name, $value, @_);
delete $self->output->{$name};
$self->{error}{$name} = [$check, $result, @_];
last;
return $self->error($name => [$check, $result, @_]);
}

return $self;
Expand All @@ -42,12 +40,18 @@ sub check {
sub csrf_protect {
my $self = shift;
my $token = $self->input->{csrf_token};
$self->{error}{csrf_token} = ['csrf_protect']
$self->error(csrf_token => ['csrf_protect'])
unless $token && $token eq ($self->csrf_token // '');
return $self;
}

sub error { shift->{error}{shift()} }
sub error {
my ($self, $name) = (shift, shift);
return $self->{error}{$name} unless @_;
$self->{error}{$name} = shift;
delete $self->output->{$name};
return $self;
}

sub has_data { !!keys %{shift->input} }

Expand Down Expand Up @@ -82,8 +86,8 @@ sub param {

sub required {
my ($self, $name) = @_;
$self->{error}{$name} = ['required'] unless $self->optional($name)->is_valid;
return $self;
return $self if $self->optional($name)->is_valid;
return $self->error($name => ['required']);
}

1;
Expand Down Expand Up @@ -170,10 +174,11 @@ Validate C<csrf_token> and protect from cross-site request forgery.
=head2 error
my $err = $validation->error('foo');
my $err = $validation->error('foo');
$validation = $validation->error(foo => ['custom_check']);
Return details about failed validation check, at any given time there can only
be one per field.
Get or set details for failed validation check, at any given time there can
only be one per field.
my ($check, $result, @args) = @{$validation->error('foo')};
Expand Down
8 changes: 8 additions & 0 deletions t/mojolicious/validation_lite_app.t
Expand Up @@ -127,6 +127,14 @@ ok $validation->required('0')->size(1, 1)->is_valid, 'valid';
is_deeply $validation->output, {0 => 0}, 'right result';
is $validation->param('0'), 0, 'right value';

# Custom error
$validation = $t->app->validation->input({foo => 'bar'});
ok !$validation->required('foo')->has_error, 'no error';
is_deeply $validation->output, {foo => 'bar'}, 'right result';
ok $validation->error(foo => ['custom_check'])->has_error, 'has error';
is_deeply $validation->output, {}, 'right result';
is_deeply $validation->error('foo'), ['custom_check'], 'right error';

# CSRF protection
$validation = $t->app->validation->input({foo => 'bar'})->csrf_protect;
ok $validation->has_data, 'has data';
Expand Down

0 comments on commit 1746449

Please sign in to comment.