diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 6d03629207d5..9b2ef4e6139e 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -642,7 +642,7 @@ public function validateDecimal($attribute, $value, $parameters) { $this->requireParameterCount(1, $parameters, 'decimal'); - if (! $this->validateNumeric($attribute, $value)) { + if (! $this->validateNumeric($attribute, $value, [])) { return false; } @@ -1863,7 +1863,7 @@ public function validateMultipleOf($attribute, $value, $parameters) { $this->requireParameterCount(1, $parameters, 'multiple_of'); - if (! $this->validateNumeric($attribute, $value) || ! $this->validateNumeric($attribute, $parameters[0])) { + if (! $this->validateNumeric($attribute, $value, []) || ! $this->validateNumeric($attribute, $parameters[0], [])) { return false; } @@ -1919,10 +1919,15 @@ public function validateNotIn($attribute, $value, $parameters) * * @param string $attribute * @param mixed $value + * @param array{0: 'strict'} $parameters * @return bool */ - public function validateNumeric($attribute, $value) + public function validateNumeric($attribute, $value, array $parameters) { + if (($parameters[0] ?? null) === 'strict' && is_string($value)) { + return false; + } + return is_numeric($value); } diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index f5c76189b153..2fa7ae995e59 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -3245,6 +3245,28 @@ public function testValidateNumeric() $this->assertTrue($v->passes()); } + public function testValidateNumericStrict() + { + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['foo' => 'asdad'], ['foo' => 'Numeric:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.23'], ['foo' => 'Numeric:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '-1'], ['foo' => 'Numeric:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1'], ['foo' => 'Numeric:strict']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => 1], ['foo' => 'Numeric:strict']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => 0.1], ['foo' => 'Numeric:strict']); + $this->assertTrue($v->passes()); + } + public function testValidateInteger() { $trans = $this->getIlluminateArrayTranslator();