diff --git a/CHANGELOG.md b/CHANGELOG.md index 65ac79fc8..be1c8f6bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Enforce a timeout for connecting to the server and for the requests instead of waiting indefinitely (#979) - Add `RequestFetcherInterface` to allow customizing the request data attached to the logged event (#984) - Log internal debug and error messages to a PSR-3 compatible logger (#989) +- Make `AbstractSerializer` to accept `Traversable` values using `is_iterable` instead of `is_array` (#991) ## 2.3.2 (2020-03-06) diff --git a/src/Serializer/AbstractSerializer.php b/src/Serializer/AbstractSerializer.php index fe7af7ec1..edc394249 100644 --- a/src/Serializer/AbstractSerializer.php +++ b/src/Serializer/AbstractSerializer.php @@ -103,7 +103,7 @@ protected function serializeRecursively($value, int $_depth = 0) return $this->serializeCallableWithoutTypeHint($value); } - if (\is_array($value)) { + if (is_iterable($value)) { $serializedArray = []; foreach ($value as $k => $v) { diff --git a/tests/Serializer/SerializerTest.php b/tests/Serializer/SerializerTest.php index 228a854f7..bbf3bf702 100644 --- a/tests/Serializer/SerializerTest.php +++ b/tests/Serializer/SerializerTest.php @@ -27,6 +27,24 @@ public function testArraysAreArrays(bool $serializeAllObjects): void $this->assertSame([1, 2, 3], $result); } + /** + * @dataProvider serializeAllObjectsDataProvider + */ + public function testTraversablesAreArrays(bool $serializeAllObjects): void + { + $serializer = $this->createSerializer(); + + if ($serializeAllObjects) { + $serializer->setSerializeAllObjects(true); + } + + $content = [1, 2, 3]; + $traversable = new \ArrayIterator($content); + $result = $this->invokeSerialization($serializer, $traversable); + + $this->assertSame([1, 2, 3], $result); + } + /** * @dataProvider serializeAllObjectsDataProvider */