Skip to content

Commit 54d1e82

Browse files
authored
Merge pull request #560 from mcg-web/fix-resolver-alias-when-using-autoconfig
Fix resolver aliases when using autoconfig
2 parents dbba9e6 + 186adaa commit 54d1e82

File tree

6 files changed

+111
-2
lines changed

6 files changed

+111
-2
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Overblog\GraphQLBundle\DependencyInjection\Compiler;
6+
7+
use Overblog\GraphQLBundle\Definition\Resolver\AliasedInterface;
8+
use Overblog\GraphQLBundle\Definition\Resolver\MutationInterface;
9+
use Overblog\GraphQLBundle\Definition\Resolver\ResolverInterface;
10+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
11+
use Symfony\Component\DependencyInjection\ContainerBuilder;
12+
use Symfony\Component\DependencyInjection\Definition;
13+
14+
final class ResolverMethodAliasesPass implements CompilerPassInterface
15+
{
16+
private const SERVICE_SUBCLASS_TAG_MAPPING = [
17+
MutationInterface::class => 'overblog_graphql.mutation',
18+
ResolverInterface::class => 'overblog_graphql.resolver',
19+
];
20+
21+
/**
22+
* {@inheritdoc}
23+
*/
24+
public function process(ContainerBuilder $container): void
25+
{
26+
foreach ($container->getDefinitions() as $definition) {
27+
foreach (self::SERVICE_SUBCLASS_TAG_MAPPING as $tagName) {
28+
$this->addDefinitionTagsFromClassReflection($definition, $tagName);
29+
}
30+
}
31+
}
32+
33+
private function addDefinitionTagsFromClassReflection(Definition $definition, string $tagName): void
34+
{
35+
if ($definition->hasTag($tagName)) {
36+
foreach ($definition->getTag($tagName) as $tag => $attributes) {
37+
if (!isset($attributes['method'])) {
38+
$reflectionClass = new \ReflectionClass($definition->getClass());
39+
40+
if (!$reflectionClass->isAbstract()) {
41+
$publicReflectionMethods = $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC);
42+
$isAliased = $reflectionClass->implementsInterface(AliasedInterface::class);
43+
foreach ($publicReflectionMethods as $publicReflectionMethod) {
44+
if ('__construct' === $publicReflectionMethod->name || $isAliased && 'getAliases' === $publicReflectionMethod->name) {
45+
continue;
46+
}
47+
$definition->addTag($tagName, ['method' => $publicReflectionMethod->name]);
48+
}
49+
}
50+
continue;
51+
}
52+
}
53+
}
54+
}
55+
}

src/OverblogGraphQLBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ExpressionFunctionPass;
1111
use Overblog\GraphQLBundle\DependencyInjection\Compiler\GlobalVariablesPass;
1212
use Overblog\GraphQLBundle\DependencyInjection\Compiler\MutationTaggedServiceMappingTaggedPass;
13+
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ResolverMethodAliasesPass;
1314
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ResolverTaggedServiceMappingPass;
1415
use Overblog\GraphQLBundle\DependencyInjection\Compiler\TypeGeneratorPass;
1516
use Overblog\GraphQLBundle\DependencyInjection\Compiler\TypeTaggedServiceMappingPass;
@@ -40,6 +41,7 @@ public function build(ContainerBuilder $container): void
4041
$container->addCompilerPass(new ConfigProcessorPass());
4142
$container->addCompilerPass(new GlobalVariablesPass());
4243
$container->addCompilerPass(new ExpressionFunctionPass());
44+
$container->addCompilerPass(new ResolverMethodAliasesPass());
4345
$container->addCompilerPass(new AliasedPass());
4446
$container->addCompilerPass(new TypeGeneratorPass(), PassConfig::TYPE_BEFORE_REMOVING);
4547
$container->addCompilerPass(new TypeTaggedServiceMappingPass(), PassConfig::TYPE_BEFORE_REMOVING);

tests/Functional/App/GraphQL/HelloWord/Type/QueryType.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function __construct(ResolverResolver $resolver)
2323
'message' => ['type' => Type::string()],
2424
],
2525
'resolve' => function ($root, $args) use ($resolver) {
26-
return $resolver->resolve([EchoResolver::class, [$args['message']]]);
26+
return $resolver->resolve([\sprintf('%s::display', EchoResolver::class), [$args['message']]]);
2727
},
2828
],
2929
],

tests/Functional/App/IsolatedResolver/EchoResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ final class EchoResolver implements ResolverInterface, ContainerAwareInterface
1212
{
1313
use ContainerAwareTrait;
1414

15-
public function __invoke($message)
15+
public function display($message): string
1616
{
1717
return $this->container->getParameter('echo.prefix').$message;
1818
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
imports:
2+
- { resource: ../config.yml }
3+
parameters:
4+
echo.prefix: "You said: "
5+
6+
overblog_graphql:
7+
definitions:
8+
schema:
9+
query: "Query"
10+
mutation: "Calc"
11+
12+
services:
13+
_defaults:
14+
autowire: true
15+
autoconfigure: true
16+
Overblog\GraphQLBundle\Tests\Functional\App\GraphQL\:
17+
resource: '../../GraphQL/*'
18+
Overblog\GraphQLBundle\Tests\Functional\App\IsolatedResolver\EchoResolver: ~
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Overblog\GraphQLBundle\Tests\Functional\AutoConfigure;
6+
7+
use Overblog\GraphQLBundle\Tests\Functional\TestCase;
8+
9+
/**
10+
* @group legacy
11+
*/
12+
class HelloWordTest extends TestCase
13+
{
14+
protected function setUp(): void
15+
{
16+
static::bootKernel(['test_case' => 'autoConfigure']);
17+
}
18+
19+
public function testQuery(): void
20+
{
21+
$query = 'query { echo(message: "This is my message!") }';
22+
$expectedData = ['echo' => 'You said: This is my message!'];
23+
24+
$this->assertGraphQL($query, $expectedData);
25+
}
26+
27+
public function testMutation(): void
28+
{
29+
$query = 'mutation { sum(x: 5, y: 15) }';
30+
$expectedData = ['sum' => 20];
31+
32+
$this->assertGraphQL($query, $expectedData);
33+
}
34+
}

0 commit comments

Comments
 (0)