diff --git a/src/Symfony/Component/Validator/CHANGELOG.md b/src/Symfony/Component/Validator/CHANGELOG.md index 6d8b2a6c5a998..3ce7032d9c3fb 100644 --- a/src/Symfony/Component/Validator/CHANGELOG.md +++ b/src/Symfony/Component/Validator/CHANGELOG.md @@ -10,6 +10,7 @@ CHANGELOG * Deprecate passing an annotation reader to the constructor signature of `AnnotationLoader` * Deprecate `ValidatorBuilder::setDoctrineAnnotationReader()` * Deprecate `ValidatorBuilder::addDefaultDoctrineAnnotationReader()` + * Add `number`, `finite-number` and `finite-float` types to `Type` constraint 6.3 --- diff --git a/src/Symfony/Component/Validator/Constraints/TypeValidator.php b/src/Symfony/Component/Validator/Constraints/TypeValidator.php index ad9e31457268f..0b4513ac03fef 100644 --- a/src/Symfony/Component/Validator/Constraints/TypeValidator.php +++ b/src/Symfony/Component/Validator/Constraints/TypeValidator.php @@ -29,6 +29,9 @@ class TypeValidator extends ConstraintValidator 'float' => 'is_float', 'double' => 'is_float', 'real' => 'is_float', + 'number' => 'is_int || is_float && !is_nan', + 'finite-float' => 'is_float && is_finite', + 'finite-number' => 'is_int || is_float && is_finite', 'numeric' => 'is_numeric', 'string' => 'is_string', 'scalar' => 'is_scalar', @@ -69,7 +72,12 @@ public function validate(mixed $value, Constraint $constraint) foreach ($types as $type) { $type = strtolower($type); - if (isset(self::VALIDATION_FUNCTIONS[$type]) && self::VALIDATION_FUNCTIONS[$type]($value)) { + if (isset(self::VALIDATION_FUNCTIONS[$type]) && match ($type) { + 'finite-float' => \is_float($value) && is_finite($value), + 'finite-number' => \is_int($value) || \is_float($value) && is_finite($value), + 'number' => \is_int($value) || \is_float($value) && !is_nan($value), + default => self::VALIDATION_FUNCTIONS[$type]($value), + }) { return; } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php index 07a112b119d73..8b4fe25314b11 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php @@ -88,6 +88,13 @@ public static function getValidValues() ['1.5', 'numeric'], [0, 'integer'], [1.5, 'float'], + [\NAN, 'float'], + [\INF, 'float'], + [1.5, 'finite-float'], + [0, 'number'], + [1.5, 'number'], + [\INF, 'number'], + [1.5, 'finite-number'], ['12345', 'string'], [[], 'array'], [$object, 'object'], @@ -135,7 +142,17 @@ public static function getInvalidValues() ['foobar', 'numeric', '"foobar"'], ['foobar', 'boolean', '"foobar"'], ['0', 'integer', '"0"'], + [\NAN, 'integer', 'NAN'], + [\INF, 'integer', 'INF'], ['1.5', 'float', '"1.5"'], + ['1.5', 'finite-float', '"1.5"'], + [\NAN, 'finite-float', 'NAN'], + [\INF, 'finite-float', 'INF'], + ['0', 'number', '"0"'], + [\NAN, 'number', 'NAN'], + ['0', 'finite-number', '"0"'], + [\NAN, 'finite-number', 'NAN'], + [\INF, 'finite-number', 'INF'], [12345, 'string', '12345'], [$object, 'boolean', 'object'], [$object, 'numeric', 'object'],