From 663a0e1f580b08eea35b9634979483acfa241c6c Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Wed, 12 Jan 2022 14:33:41 +0200 Subject: [PATCH 1/2] handle type mismatch in the enum validation rule --- src/Illuminate/Validation/Rules/Enum.php | 7 ++++++- tests/Validation/ValidationEnumRuleTest.php | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Validation/Rules/Enum.php b/src/Illuminate/Validation/Rules/Enum.php index 3d8bcc102f9..b7cf1b5292e 100644 --- a/src/Illuminate/Validation/Rules/Enum.php +++ b/src/Illuminate/Validation/Rules/Enum.php @@ -3,6 +3,7 @@ namespace Illuminate\Validation\Rules; use Illuminate\Contracts\Validation\Rule; +use Throwable; class Enum implements Rule { @@ -37,7 +38,11 @@ public function passes($attribute, $value) return false; } - return ! is_null($this->type::tryFrom($value)); + try { + return ! is_null($this->type::tryFrom($value)); + } catch (Throwable $e) { + return false; + } } /** diff --git a/tests/Validation/ValidationEnumRuleTest.php b/tests/Validation/ValidationEnumRuleTest.php index 4b8f337aba9..a094590a3a4 100644 --- a/tests/Validation/ValidationEnumRuleTest.php +++ b/tests/Validation/ValidationEnumRuleTest.php @@ -131,6 +131,22 @@ public function testValidationFailsOnPureEnum() $this->assertTrue($v->fails()); } + public function testValidationFailsWhenProvidingStringToIntegerType() + { + $v = new Validator( + resolve('translator'), + [ + 'status' => 'abc', + ], + [ + 'status' => new Enum(IntegerStatus::class), + ] + ); + + $this->assertTrue($v->fails()); + $this->assertEquals(['The selected status is invalid.'], $v->messages()->get('status')); + } + protected function setUp(): void { $container = Container::getInstance(); From 2ac1ce25783e5e1245209d0599223de30ff19952 Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Wed, 12 Jan 2022 15:00:11 +0200 Subject: [PATCH 2/2] switch to catching TypeError --- src/Illuminate/Validation/Rules/Enum.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Validation/Rules/Enum.php b/src/Illuminate/Validation/Rules/Enum.php index b7cf1b5292e..df8f9821b65 100644 --- a/src/Illuminate/Validation/Rules/Enum.php +++ b/src/Illuminate/Validation/Rules/Enum.php @@ -3,7 +3,7 @@ namespace Illuminate\Validation\Rules; use Illuminate\Contracts\Validation\Rule; -use Throwable; +use TypeError; class Enum implements Rule { @@ -40,7 +40,7 @@ public function passes($attribute, $value) try { return ! is_null($this->type::tryFrom($value)); - } catch (Throwable $e) { + } catch (TypeError $e) { return false; } }