21
21
class TypeValidator extends ConstraintValidator
22
22
{
23
23
private const VALIDATION_FUNCTIONS = [
24
- 'bool ' => 'is_bool ' ,
25
- 'boolean ' => 'is_bool ' ,
26
- 'int ' => 'is_int ' ,
27
- 'integer ' => 'is_int ' ,
28
- 'long ' => 'is_int ' ,
29
- 'float ' => 'is_float ' ,
30
- 'double ' => 'is_float ' ,
31
- 'real ' => 'is_float ' ,
32
- 'numeric ' => 'is_numeric ' ,
33
- 'string ' => 'is_string ' ,
34
- 'scalar ' => 'is_scalar ' ,
35
- 'array ' => 'is_array ' ,
36
- 'iterable ' => 'is_iterable ' ,
37
- 'countable ' => 'is_countable ' ,
38
- 'callable ' => 'is_callable ' ,
39
- 'object ' => 'is_object ' ,
40
- 'resource ' => 'is_resource ' ,
41
- 'null ' => 'is_null ' ,
42
- 'alnum ' => 'ctype_alnum ' ,
43
- 'alpha ' => 'ctype_alpha ' ,
44
- 'cntrl ' => 'ctype_cntrl ' ,
45
- 'digit ' => 'ctype_digit ' ,
46
- 'graph ' => 'ctype_graph ' ,
47
- 'lower ' => 'ctype_lower ' ,
48
- 'print ' => 'ctype_print ' ,
49
- 'punct ' => 'ctype_punct ' ,
50
- 'space ' => 'ctype_space ' ,
51
- 'upper ' => 'ctype_upper ' ,
52
- 'xdigit ' => 'ctype_xdigit ' ,
24
+ 'bool ' => 'is_bool ' ,
25
+ 'boolean ' => 'is_bool ' ,
26
+ 'int ' => 'is_int ' ,
27
+ 'integer ' => 'is_int ' ,
28
+ 'long ' => 'is_int ' ,
29
+ 'float ' => 'is_float ' ,
30
+ 'double ' => 'is_float ' ,
31
+ 'real ' => 'is_float ' ,
32
+ 'number ' => 'is_int || is_float ' ,
33
+ 'finite-float ' => 'is_float && is_finite ' ,
34
+ 'finite-number ' => 'is_int || is_float && is_finite ' ,
35
+ 'numeric ' => 'is_numeric ' ,
36
+ 'string ' => 'is_string ' ,
37
+ 'scalar ' => 'is_scalar ' ,
38
+ 'array ' => 'is_array ' ,
39
+ 'iterable ' => 'is_iterable ' ,
40
+ 'countable ' => 'is_countable ' ,
41
+ 'callable ' => 'is_callable ' ,
42
+ 'object ' => 'is_object ' ,
43
+ 'resource ' => 'is_resource ' ,
44
+ 'null ' => 'is_null ' ,
45
+ 'alnum ' => 'ctype_alnum ' ,
46
+ 'alpha ' => 'ctype_alpha ' ,
47
+ 'cntrl ' => 'ctype_cntrl ' ,
48
+ 'digit ' => 'ctype_digit ' ,
49
+ 'graph ' => 'ctype_graph ' ,
50
+ 'lower ' => 'ctype_lower ' ,
51
+ 'print ' => 'ctype_print ' ,
52
+ 'punct ' => 'ctype_punct ' ,
53
+ 'space ' => 'ctype_space ' ,
54
+ 'upper ' => 'ctype_upper ' ,
55
+ 'xdigit ' => 'ctype_xdigit ' ,
53
56
];
54
57
55
58
/**
@@ -69,7 +72,12 @@ public function validate(mixed $value, Constraint $constraint)
69
72
70
73
foreach ($ types as $ type ) {
71
74
$ type = strtolower ($ type );
72
- if (isset (self ::VALIDATION_FUNCTIONS [$ type ]) && self ::VALIDATION_FUNCTIONS [$ type ]($ value )) {
75
+ if (isset (self ::VALIDATION_FUNCTIONS [$ type ]) && match ($ type ) {
76
+ 'finite-float ' => \is_float ($ value ) && \is_finite ($ value ),
77
+ 'finite-number ' => \is_int ($ value ) || \is_float ($ value ) && \is_finite ($ value ),
78
+ 'number ' => \is_int ($ value ) || \is_float ($ value ),
79
+ default => self ::VALIDATION_FUNCTIONS [$ type ]($ value ),
80
+ }) {
73
81
return ;
74
82
}
75
83
0 commit comments