Skip to content

Commit aad8a84

Browse files
authored
Merge pull request #3463 from renaudclosset/2.5
…Do not treat classes implementing \Traversable as collection
2 parents 3fe314b + 18a41fe commit aad8a84

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

src/Api/ResourceClassResolver.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ public function getResourceClass($value, string $resourceClass = null, bool $str
4545
throw new InvalidArgumentException('Strict checking is only possible when resource class is specified.');
4646
}
4747

48-
$actualClass = \is_object($value) && !$value instanceof \Traversable ? $this->getObjectClass($value) : null;
48+
$objectClass = \is_object($value) ? $this->getObjectClass($value) : null;
49+
$actualClass = ($objectClass && (!$value instanceof \Traversable || $this->isResourceClass($objectClass))) ? $this->getObjectClass($value) : null;
4950

5051
if (null === $actualClass && null === $resourceClass) {
5152
throw new InvalidArgumentException('Resource type could not be determined. Resource class must be specified.');

src/Serializer/AbstractItemNormalizer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public function __construct(PropertyNameCollectionFactoryInterface $propertyName
9090
*/
9191
public function supportsNormalization($data, $format = null)
9292
{
93-
if (!\is_object($data) || $data instanceof \Traversable) {
93+
if (!\is_object($data)) {
9494
return false;
9595
}
9696

tests/Api/ResourceClassResolverTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,18 @@ public function testGetResourceClassWithTraversableAsValue()
8888
$this->assertEquals(Dummy::class, $resourceClassResolver->getResourceClass($dummies, Dummy::class));
8989
}
9090

91+
public function testGetResourceClassWithTraversable()
92+
{
93+
$resourceNameCollectionFactoryProphecy = $this->prophesize(ResourceNameCollectionFactoryInterface::class);
94+
$resourceNameCollectionFactoryProphecy->create()->willReturn(new ResourceNameCollection([\ArrayObject::class]));
95+
96+
$dummy = new \ArrayObject();
97+
98+
$resourceClassResolver = new ResourceClassResolver($resourceNameCollectionFactoryProphecy->reveal());
99+
100+
$this->assertEquals(\ArrayObject::class, $resourceClassResolver->getResourceClass($dummy));
101+
}
102+
91103
public function testGetResourceClassWithPaginatorInterfaceAsValue()
92104
{
93105
$resourceNameCollectionFactoryProphecy = $this->prophesize(ResourceNameCollectionFactoryInterface::class);
@@ -119,6 +131,7 @@ public function testGetResourceClassWithNoResourceClassName()
119131
$this->expectExceptionMessage('Resource type could not be determined. Resource class must be specified.');
120132

121133
$resourceNameCollectionFactoryProphecy = $this->prophesize(ResourceNameCollectionFactoryInterface::class);
134+
$resourceNameCollectionFactoryProphecy->create()->willReturn(new ResourceNameCollection([]));
122135

123136
$resourceClassResolver = new ResourceClassResolver($resourceNameCollectionFactoryProphecy->reveal());
124137

0 commit comments

Comments
 (0)