Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 717ca76

Browse filesBrowse files
bug #59501 [Serializer] [ObjectNormalizer] Filter int when using FILTER_BOOL (DjordyKoert)
This PR was submitted for the 7.2 branch but it was squashed and merged into the 7.1 branch instead. Discussion ---------- [Serializer] [ObjectNormalizer] Filter int when using FILTER_BOOL | Q | A | ------------- | --- | Branch? | 7.2 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | Fix ... | License | MIT Improves on #57541 to also allow numeric values `1` and `0` with `FILTER_BOOL => true` Currently attempting to use the Serializer component to deserialize to deserialize a `1` or `0` result in the following error: ``` The type of the "booleanProperty" attribute for class "App\MyDTO" must be one of "bool" ("int" given). ``` Commits ------- 5288eba [Serializer] [ObjectNormalizer] Filter int when using FILTER_BOOL
2 parents f8296b7 + 5288eba commit 717ca76
Copy full SHA for 717ca76

File tree

2 files changed

+24
-11
lines changed
Filter options

2 files changed

+24
-11
lines changed

‎src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php
+2-2
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ private function validateAndDenormalizeLegacy(array $types, string $currentClass
569569
return (float) $data;
570570
}
571571

572-
if (LegacyType::BUILTIN_TYPE_BOOL === $builtinType && \is_string($data) && ($context[self::FILTER_BOOL] ?? false)) {
572+
if (LegacyType::BUILTIN_TYPE_BOOL === $builtinType && (\is_string($data) || \is_int($data)) && ($context[self::FILTER_BOOL] ?? false)) {
573573
return filter_var($data, \FILTER_VALIDATE_BOOL, \FILTER_NULL_ON_FAILURE);
574574
}
575575

@@ -854,7 +854,7 @@ private function validateAndDenormalize(Type $type, string $currentClass, string
854854
return (float) $data;
855855
}
856856

857-
if (TypeIdentifier::BOOL === $typeIdentifier && \is_string($data) && ($context[self::FILTER_BOOL] ?? false)) {
857+
if (TypeIdentifier::BOOL === $typeIdentifier && (\is_string($data) || \is_int($data)) && ($context[self::FILTER_BOOL] ?? false)) {
858858
return filter_var($data, \FILTER_VALIDATE_BOOL, \FILTER_NULL_ON_FAILURE);
859859
}
860860

‎src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php
+22-9
Original file line numberDiff line numberDiff line change
@@ -1216,15 +1216,34 @@ public static function provideDenormalizeWithFilterBoolData(): array
12161216
{
12171217
return [
12181218
[['foo' => 'true'], true],
1219+
[['foo' => 'True'], true],
1220+
[['foo' => 'TRUE'], true],
12191221
[['foo' => '1'], true],
1222+
[['foo' => 1], true],
12201223
[['foo' => 'yes'], true],
1224+
[['foo' => 'Yes'], true],
1225+
[['foo' => 'YES'], true],
1226+
[['foo' => 'on'], true],
1227+
[['foo' => 'On'], true],
1228+
[['foo' => 'ON'], true],
12211229
[['foo' => 'false'], false],
1230+
[['foo' => 'False'], false],
1231+
[['foo' => 'FALSE'], false],
12221232
[['foo' => '0'], false],
1233+
[['foo' => 0], false],
12231234
[['foo' => 'no'], false],
1235+
[['foo' => 'No'], false],
1236+
[['foo' => 'NO'], false],
1237+
[['foo' => 'off'], false],
1238+
[['foo' => 'Off'], false],
1239+
[['foo' => 'OFF'], false],
12241240
[['foo' => ''], false],
12251241
[['foo' => null], null],
12261242
[['foo' => 'null'], null],
12271243
[['foo' => 'something'], null],
1244+
[['foo' => 'foo'], null],
1245+
[['foo' => 1234567890], null],
1246+
[['foo' => -1234567890], null],
12281247
];
12291248
}
12301249

@@ -1253,10 +1272,7 @@ protected function isAllowedAttribute($classOrObject, string $attribute, ?string
12531272

12541273
public function testTemplateTypeWhenAnObjectIsPassedToDenormalize()
12551274
{
1256-
$normalizer = new class (
1257-
classMetadataFactory: new ClassMetadataFactory(new AttributeLoader()),
1258-
propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpStanExtractor(), new ReflectionExtractor()])
1259-
) extends AbstractObjectNormalizerDummy {
1275+
$normalizer = new class(classMetadataFactory: new ClassMetadataFactory(new AttributeLoader()), propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpStanExtractor(), new ReflectionExtractor()])) extends AbstractObjectNormalizerDummy {
12601276
protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []): bool
12611277
{
12621278
return true;
@@ -1279,10 +1295,7 @@ public function testDenormalizeTemplateType()
12791295
$this->markTestSkipped('The PropertyInfo component before Symfony 7.1 does not support template types.');
12801296
}
12811297

1282-
$normalizer = new class (
1283-
classMetadataFactory: new ClassMetadataFactory(new AttributeLoader()),
1284-
propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpStanExtractor(), new ReflectionExtractor()])
1285-
) extends AbstractObjectNormalizerDummy {
1298+
$normalizer = new class(classMetadataFactory: new ClassMetadataFactory(new AttributeLoader()), propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpStanExtractor(), new ReflectionExtractor()])) extends AbstractObjectNormalizerDummy {
12861299
protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []): bool
12871300
{
12881301
return true;
@@ -1587,7 +1600,7 @@ class TruePropertyDummy
15871600

15881601
class BoolPropertyDummy
15891602
{
1590-
/** @var null|bool */
1603+
/** @var bool|null */
15911604
public $foo;
15921605
}
15931606

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.