diff --git a/src/Illuminate/Validation/Rules/Enum.php b/src/Illuminate/Validation/Rules/Enum.php index 3d8bcc102f9..df8f9821b65 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 TypeError; 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 (TypeError $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();