From d6831fd2bbcadf84ffbaf52b539878a3af0b6455 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Thu, 17 Jul 2025 15:47:17 +0100 Subject: [PATCH 1/2] Allows for strict numeric validation --- .../Concerns/ValidatesAttributes.php | 11 +++++++--- tests/Validation/ValidationValidatorTest.php | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 6d03629207d5..aae79fa5c815 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(); From 4b2ecad559d69cfcbf0407c3fd352d325b39a2d9 Mon Sep 17 00:00:00 2001 From: Peter Fox Date: Thu, 17 Jul 2025 17:07:48 +0100 Subject: [PATCH 2/2] style fix --- src/Illuminate/Validation/Concerns/ValidatesAttributes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index aae79fa5c815..9b2ef4e6139e 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -1919,7 +1919,7 @@ public function validateNotIn($attribute, $value, $parameters) * * @param string $attribute * @param mixed $value - * @param array{0: 'strict'} $parameters + * @param array{0: 'strict'} $parameters * @return bool */ public function validateNumeric($attribute, $value, array $parameters)