Skip to content

Commit c91bbc9

Browse files
author
Jeremiah VALERIE
committed
wip
1 parent f365458 commit c91bbc9

File tree

4 files changed

+91
-9
lines changed

4 files changed

+91
-9
lines changed

src/DependencyInjection/Compiler/GraphQLServicesPass.php

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44

55
namespace Overblog\GraphQLBundle\DependencyInjection\Compiler;
66

7-
use InvalidArgumentException;
87
use Overblog\GraphQLBundle\Definition\GraphQLServices;
98
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
109
use Symfony\Component\DependencyInjection\ContainerBuilder;
10+
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
11+
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
1112
use Symfony\Component\DependencyInjection\Reference;
1213
use function is_string;
1314
use function sprintf;
@@ -19,6 +20,8 @@ final class GraphQLServicesPass implements CompilerPassInterface
1920
*/
2021
public function process(ContainerBuilder $container): void
2122
{
23+
$this->tagAllNotTaggedGraphQLServices($container);
24+
2225
$taggedServices = $container->findTaggedServiceIds('overblog_graphql.service', true);
2326

2427
$locateableServices = [];
@@ -51,6 +54,84 @@ public function process(ContainerBuilder $container): void
5154
['container', 'service_container']
5255
);
5356

54-
$container->findDefinition(GraphQLServices::class)->addArgument($locateableServices);
57+
$container->findDefinition(GraphQLServices::class)->addArgument(array_unique($locateableServices));
58+
}
59+
60+
private function tagAllNotTaggedGraphQLServices(ContainerBuilder $container): void
61+
{
62+
if (!$container->hasParameter('overblog_graphql_types.config')) {
63+
return;
64+
}
65+
/** @var array $configs */
66+
$configs = $container->getParameter('overblog_graphql_types.config');
67+
foreach ($configs as &$typeConfig) {
68+
switch ($typeConfig['type']) {
69+
case 'object':
70+
if (isset($typeConfig['config']['fieldResolver'])) {
71+
$this->resolveServiceIdAndMethod($container, $typeConfig['config']['fieldResolver']);
72+
}
73+
74+
foreach ($typeConfig['config']['fields'] as &$field) {
75+
if (isset($field['resolver'])) {
76+
$this->resolveServiceIdAndMethod($container, $field['resolver']);
77+
}
78+
}
79+
break;
80+
81+
case 'interface':
82+
case 'union':
83+
if (isset($typeConfig['config']['typeResolver'])) {
84+
$this->resolveServiceIdAndMethod($container, $typeConfig['config']['typeResolver']);
85+
}
86+
break;
87+
}
88+
}
89+
$container->setParameter('overblog_graphql_types.config', $configs);
90+
}
91+
92+
private function resolveServiceIdAndMethod(ContainerBuilder $container, ?array &$resolver): void
93+
{
94+
if (!isset($resolver['id']) && !isset($resolver['method'])) {
95+
return;
96+
}
97+
$originalId = $resolver['id'] ?? null;
98+
$originalMethod = $resolver['method'] ?? null;
99+
100+
if (null === $originalId) {
101+
[$id, $method] = explode('::', $originalMethod, 2) + [null, null];
102+
$throw = false;
103+
} else {
104+
$id = $originalId;
105+
$method = $originalMethod;
106+
$throw = true;
107+
}
108+
109+
try {
110+
$definition = $container->getDefinition($id);
111+
} catch (ServiceNotFoundException $e) {
112+
// get Alias real service ID
113+
try {
114+
$alias = $container->getAlias($id);
115+
$id = (string) $alias;
116+
$definition = $container->getDefinition($id);
117+
} catch (ServiceNotFoundException | InvalidArgumentException $e) {
118+
if ($throw) {
119+
throw $e;
120+
}
121+
$resolver['id'] = null;
122+
$resolver['method'] = $originalMethod;
123+
124+
return;
125+
}
126+
}
127+
if (
128+
!$definition->hasTag('overblog_graphql.service')
129+
&& !$definition->hasTag('overblog_graphql.global_variable')
130+
) {
131+
$definition->addTag('overblog_graphql.service');
132+
}
133+
134+
$resolver['id'] = $id;
135+
$resolver['method'] = $method;
55136
}
56137
}

src/Generator/TypeBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -886,7 +886,7 @@ protected function buildCallback(Callback $callback, array $argNames, ?callable
886886
return $expressionBuilder($callback->expression);
887887
}
888888
} elseif (null !== $callback->id) {
889-
$fn = "$this->gqlServices->get('callbacks')->get('$callback->id')";
889+
$fn = "$this->gqlServices->get('$callback->id')";
890890
if ($callback->method) {
891891
return Collection::numeric([$fn, $callback->method]);
892892
} else {

tests/Functional/App/config/connection/mapping/connection.types.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Query:
44
fields:
55
user:
66
type: User
7-
resolve: '@=query("query")'
7+
resolver: 'Overblog\GraphQLBundle\Tests\Functional\App\Resolver\ConnectionResolver::resolveQuery'
88

99
User:
1010
type: object
@@ -16,15 +16,15 @@ User:
1616
friends:
1717
type: friendConnection
1818
argsBuilder: "Relay::Connection"
19-
resolve: '@=query("friends", value, args)'
19+
resolver: 'overblog_graphql.test.resolver.node::friendsResolver'
2020
friendsForward:
2121
type: userConnection
2222
argsBuilder: "Relay::ForwardConnection"
23-
resolve: '@=query("friends", value, args)'
23+
resolver: 'overblog_graphql.test.resolver.node::friendsResolver'
2424
friendsBackward:
2525
type: userConnection
2626
argsBuilder: "Relay::BackwardConnection"
27-
resolve: '@=query("friends", value, args)'
27+
resolver: 'overblog_graphql.test.resolver.node::friendsResolver'
2828

2929
friendConnection:
3030
type: relay-connection
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
services:
2-
overblog_graphql.test.resolver.node:
3-
class: Overblog\GraphQLBundle\Tests\Functional\App\Resolver\ConnectionResolver
2+
Overblog\GraphQLBundle\Tests\Functional\App\Resolver\ConnectionResolver:
43
arguments:
54
- "@overblog_graphql.promise_adapter"
65
tags:
@@ -9,3 +8,5 @@ services:
98
- { name: "overblog_graphql.query", alias: "query", method: "resolveQuery" }
109
- { name: "overblog_graphql.query", alias: "connection", method: "resolveConnection" }
1110
- { name: "overblog_graphql.query", alias: "promise", method: "resolvePromiseFullFilled" }
11+
12+
overblog_graphql.test.resolver.node: '@Overblog\GraphQLBundle\Tests\Functional\App\Resolver\ConnectionResolver'

0 commit comments

Comments
 (0)