diff --git a/src/GraphQl/State/Provider/ResolverProvider.php b/src/GraphQl/State/Provider/ResolverProvider.php index 05dcb785c3e..1b6f1fe77f3 100644 --- a/src/GraphQl/State/Provider/ResolverProvider.php +++ b/src/GraphQl/State/Provider/ResolverProvider.php @@ -69,7 +69,7 @@ private function getResourceClass(?object $item, ?string $resourceClass, string return $itemClass; } - if ($resourceClass !== $itemClass) { + if ($resourceClass !== $itemClass && !$item instanceof $resourceClass) { throw new \UnexpectedValueException(sprintf($errorMessage, (new \ReflectionClass($resourceClass))->getShortName(), (new \ReflectionClass($itemClass))->getShortName())); } diff --git a/src/GraphQl/Tests/State/Provider/ResolverProviderTest.php b/src/GraphQl/Tests/State/Provider/ResolverProviderTest.php index 75d8f698ac9..64d9e9b8220 100644 --- a/src/GraphQl/Tests/State/Provider/ResolverProviderTest.php +++ b/src/GraphQl/Tests/State/Provider/ResolverProviderTest.php @@ -15,6 +15,9 @@ use ApiPlatform\GraphQl\Resolver\QueryItemResolverInterface; use ApiPlatform\GraphQl\State\Provider\ResolverProvider; +use ApiPlatform\GraphQl\Tests\Fixtures\ApiResource\ChildFoo; +use ApiPlatform\GraphQl\Tests\Fixtures\ApiResource\ParentFoo; +use ApiPlatform\Metadata\GraphQl\Query; use ApiPlatform\Metadata\GraphQl\QueryCollection; use ApiPlatform\State\ProviderInterface; use PHPUnit\Framework\TestCase; @@ -35,4 +38,18 @@ public function testProvide(): void $provider = new ResolverProvider($decorated, $resolverLocator); $this->assertEquals($res, $provider->provide($operation, [], $context)); } + + public function testProvideInheritedClass(): void + { + $res = new ChildFoo(); + $operation = new Query(class: ParentFoo::class, resolver: 'foo'); + $context = []; + $decorated = $this->createMock(ProviderInterface::class); + $resolverMock = $this->createMock(QueryItemResolverInterface::class); + $resolverMock->expects($this->once())->method('__invoke')->willReturn($res); + $resolverLocator = $this->createMock(ContainerInterface::class); + $resolverLocator->expects($this->once())->method('get')->with('foo')->willReturn($resolverMock); + $provider = new ResolverProvider($decorated, $resolverLocator); + $this->assertEquals($res, $provider->provide($operation, [], $context)); + } }