diff --git a/Changes b/Changes index 320936c110..9cae8ff251 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,8 @@ 9.50 UNRELEASED + - Fixed Mojolicious::Validator::Validation to croak with a clear message naming the filter when an unknown + filter name is passed to "optional" or "required", instead of crashing with a confusing + "Can't locate object method """ error. 9.49 2026-08-10 - Added EXPERIMENTAL support for partitioned cookies. (rawleyfowler) diff --git a/lib/Mojolicious/Validator/Validation.pm b/lib/Mojolicious/Validator/Validation.pm index a3da6a7623..2059e87c3c 100644 --- a/lib/Mojolicious/Validator/Validation.pm +++ b/lib/Mojolicious/Validator/Validation.pm @@ -71,7 +71,9 @@ sub optional { return $self->topic($name) unless defined(my $input = $self->input->{$name}); my @input = ref $input eq 'ARRAY' ? @$input : ($input); - for my $cb (map { $self->validator->filters->{$_} } @filters) { + for my $filter (@filters) { + my $cb = $self->validator->filters->{$filter}; + Carp::croak qq{Unknown filter "$filter"} unless defined $cb; @input = map { $self->$cb($name, $_) } @input; } $self->output->{$name} = @input > 1 ? \@input : $input[0] if @input && !grep { !defined } @input; diff --git a/t/mojolicious/validation_lite_app.t b/t/mojolicious/validation_lite_app.t index 19199ce1bd..b875a4f8ba 100644 --- a/t/mojolicious/validation_lite_app.t +++ b/t/mojolicious/validation_lite_app.t @@ -279,6 +279,12 @@ subtest 'Custom filter' => sub { is_deeply $v->output, {foo => ['foo="bar"', 'foo="baz"']}, 'right result'; }; +subtest 'Unknown filter' => sub { + my $v = $t->app->validation->input({foo => 'bar'}); + eval { $v->optional('foo', 'does_not_exist') }; + like $@, qr/Unknown filter "does_not_exist"/, 'clear error naming the unknown filter'; +}; + subtest 'Multiple empty values' => sub { my $v = $t->app->validation; ok !$v->has_data, 'no data';