Skip to content

Commit

Permalink
[Serializer] [ObjectNormalizer] Use bool filter when FILTER_BOOL is set
Browse files Browse the repository at this point in the history
Maximilian Zumbansen authored and nicolas-grekas committed Jun 28, 2024
1 parent 5d03a74 commit 5969918
Showing 2 changed files with 42 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Normalizer/AbstractObjectNormalizer.php
Original file line number Diff line number Diff line change
@@ -566,6 +566,10 @@ private function validateAndDenormalizeLegacy(array $types, string $currentClass
return (float) $data;
}

if (LegacyType::BUILTIN_TYPE_BOOL === $builtinType && \is_string($data) && ($context[self::FILTER_BOOL] ?? false)) {
return filter_var($data, \FILTER_VALIDATE_BOOL, \FILTER_NULL_ON_FAILURE);
}

if ((LegacyType::BUILTIN_TYPE_FALSE === $builtinType && false === $data) || (LegacyType::BUILTIN_TYPE_TRUE === $builtinType && true === $data)) {
return $data;
}
@@ -787,6 +791,10 @@ private function validateAndDenormalize(Type $type, string $currentClass, string
return (float) $data;
}

if (TypeIdentifier::BOOL === $typeIdentifier && \is_string($data) && ($context[self::FILTER_BOOL] ?? false)) {
return filter_var($data, \FILTER_VALIDATE_BOOL, \FILTER_NULL_ON_FAILURE);
}

$dataMatchesExpectedType = match ($typeIdentifier) {
TypeIdentifier::ARRAY => \is_array($data),
TypeIdentifier::BOOL => \is_bool($data),
34 changes: 34 additions & 0 deletions Tests/Normalizer/AbstractObjectNormalizerTest.php
Original file line number Diff line number Diff line change
@@ -1195,6 +1195,34 @@ public function provideBooleanTypesData()
[['foo' => false], TruePropertyDummy::class],
];
}

/**
* @dataProvider provideDenormalizeWithFilterBoolData
*/
public function testDenormalizeBooleanTypeWithFilterBool(array $data, ?bool $expectedFoo)
{
$normalizer = new AbstractObjectNormalizerWithMetadataAndPropertyTypeExtractors();

$dummy = $normalizer->denormalize($data, BoolPropertyDummy::class, null, [AbstractNormalizer::FILTER_BOOL => true]);

$this->assertSame($expectedFoo, $dummy->foo);
}

public function provideDenormalizeWithFilterBoolData(): array
{
return [
[['foo' => 'true'], true],
[['foo' => '1'], true],
[['foo' => 'yes'], true],
[['foo' => 'false'], false],
[['foo' => '0'], false],
[['foo' => 'no'], false],
[['foo' => ''], false],
[['foo' => null], null],
[['foo' => 'null'], null],
[['foo' => 'something'], null],
];
}
}

class AbstractObjectNormalizerDummy extends AbstractObjectNormalizer
@@ -1480,6 +1508,12 @@ class TruePropertyDummy
public $foo;
}

class BoolPropertyDummy
{
/** @var null|bool */
public $foo;
}

class SerializerCollectionDummy implements SerializerInterface, DenormalizerInterface
{
private array $normalizers;

0 comments on commit 5969918

Please sign in to comment.