Skip to content

Commit 46d0443

Browse files
renaudclossetsoyuka
authored andcommitted
Do not treat classes implementing \Traversable as collection if defined as resource
1 parent 3fe314b commit 46d0443

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
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.');

tests/Api/ResourceClassResolverTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,19 @@ 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+
99+
$resourceClassResolver = new ResourceClassResolver($resourceNameCollectionFactoryProphecy->reveal());
100+
101+
$this->assertEquals(\ArrayObject::class, $resourceClassResolver->getResourceClass($dummy));
102+
}
103+
91104
public function testGetResourceClassWithPaginatorInterfaceAsValue()
92105
{
93106
$resourceNameCollectionFactoryProphecy = $this->prophesize(ResourceNameCollectionFactoryInterface::class);
@@ -119,6 +132,7 @@ public function testGetResourceClassWithNoResourceClassName()
119132
$this->expectExceptionMessage('Resource type could not be determined. Resource class must be specified.');
120133

121134
$resourceNameCollectionFactoryProphecy = $this->prophesize(ResourceNameCollectionFactoryInterface::class);
135+
$resourceNameCollectionFactoryProphecy->create()->willReturn(new ResourceNameCollection([]));
122136

123137
$resourceClassResolver = new ResourceClassResolver($resourceNameCollectionFactoryProphecy->reveal());
124138

0 commit comments

Comments
 (0)