From 4f555d9bc9de996b5c577396076b674e17fbb429 Mon Sep 17 00:00:00 2001 From: Romain Canon Date: Sun, 17 Mar 2024 16:41:57 +0100 Subject: [PATCH] fix: properly handle `ArrayObject` normalization --- .../Transformer/RecursiveTransformer.php | 3 ++- .../Integration/Normalizer/NormalizerTest.php | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Normalizer/Transformer/RecursiveTransformer.php b/src/Normalizer/Transformer/RecursiveTransformer.php index da202a99..ca365b71 100644 --- a/src/Normalizer/Transformer/RecursiveTransformer.php +++ b/src/Normalizer/Transformer/RecursiveTransformer.php @@ -4,6 +4,7 @@ namespace CuyZ\Valinor\Normalizer\Transformer; +use ArrayObject; use BackedEnum; use Closure; use CuyZ\Valinor\Definition\AttributeDefinition; @@ -111,7 +112,7 @@ private function defaultTransformer(mixed $value, WeakMap $references): mixed return $value->getName(); } - if ($value::class === stdClass::class) { + if ($value::class === stdClass::class || $value instanceof ArrayObject) { return array_map( fn (mixed $value) => $this->doTransform($value, $references), (array)$value diff --git a/tests/Integration/Normalizer/NormalizerTest.php b/tests/Integration/Normalizer/NormalizerTest.php index 22f0a2eb..d120799e 100644 --- a/tests/Integration/Normalizer/NormalizerTest.php +++ b/tests/Integration/Normalizer/NormalizerTest.php @@ -4,6 +4,7 @@ namespace CuyZ\Valinor\Tests\Integration\Normalizer; +use ArrayObject; use Attribute; use CuyZ\Valinor\Normalizer\Exception\CircularReferenceFoundDuringNormalization; use CuyZ\Valinor\Normalizer\Exception\KeyTransformerHasTooManyParameters; @@ -178,6 +179,24 @@ public static function normalize_basic_values_yields_expected_output_data_provid 'expected json' => '{"foo":"foo","bar":"bar"}', ]; + yield 'ArrayObject' => [ + 'input' => new ArrayObject(['foo' => 'foo', 'bar' => 'bar']), + 'expected array' => [ + 'foo' => 'foo', + 'bar' => 'bar', + ], + 'expected json' => '{"foo":"foo","bar":"bar"}', + ]; + + yield 'class inheriting ArrayObject' => [ + 'input' => new class (['foo' => 'foo', 'bar' => 'bar']) extends ArrayObject {}, + 'expected array' => [ + 'foo' => 'foo', + 'bar' => 'bar', + ], + 'expected json' => '{"foo":"foo","bar":"bar"}', + ]; + yield 'array of object' => [ 'input' => [ 'foo' => new BasicObject('foo'),