Skip to content

Commit 4611415

Browse files
committed
wip
1 parent a5208b8 commit 4611415

10 files changed

+114
-97
lines changed

src/Config/InterfaceTypeDefinition.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ public function getDefinition(): ArrayNodeDefinition
1212
{
1313
/** @var ArrayNodeDefinition $node */
1414
$node = self::createNode('_interface_config');
15-
$this->resolverNormalization($node, 'typeResolver', 'resolveType');
15+
$this->callbackNormalization($node, 'typeResolver', 'resolveType');
1616

1717
/** @phpstan-ignore-next-line */
1818
$node
1919
->children()
2020
->append($this->nameSection())
2121
->append($this->outputFieldsSection())
22-
->append($this->resolverSection('typeResolver', 'GraphQL type resolver'))
22+
->append($this->callbackSection('typeResolver', 'GraphQL type resolver'))
2323
->append($this->descriptionSection())
2424
->arrayNode('interfaces')
2525
->prototype('scalar')->info('One of internal or custom interface types.')->end()

src/Config/ObjectTypeDefinition.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function getDefinition(): ArrayNodeDefinition
1616

1717
/** @var ArrayNodeDefinition $node */
1818
$node = $builder->getRootNode();
19-
$this->resolverNormalization($node, 'fieldResolver', 'resolveField');
19+
$this->callbackNormalization($node, 'fieldResolver', 'resolveField');
2020

2121
/** @phpstan-ignore-next-line */
2222
$node
@@ -30,7 +30,7 @@ public function getDefinition(): ArrayNodeDefinition
3030
->prototype('scalar')->info('One of internal or custom interface types.')->end()
3131
->end()
3232
->variableNode('isTypeOf')->end()
33-
->append($this->resolverSection('fieldResolver', 'GraphQL field value resolver'))
33+
->append($this->callbackSection('fieldResolver', 'GraphQL field value resolver'))
3434
->variableNode('fieldsDefaultAccess')
3535
->info('Default access control to fields (expression language can be use here)')
3636
->end()

src/Config/TypeDefinition.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ protected function typeSection(bool $isRequired = false): ScalarNodeDefinition
153153
return $node;
154154
}
155155

156-
protected function resolverNormalization(NodeDefinition $node, string $new, string $old): void
156+
protected function callbackNormalization(NodeDefinition $node, string $new, string $old): void
157157
{
158158
$node
159159
->beforeNormalization()
@@ -195,7 +195,7 @@ protected function resolverNormalization(NodeDefinition $node, string $new, stri
195195
;
196196
}
197197

198-
protected function resolverSection(string $name, string $info): ArrayNodeDefinition
198+
protected function callbackSection(string $name, string $info): ArrayNodeDefinition
199199
{
200200
/** @var ArrayNodeDefinition $node */
201201
$node = self::createNode($name);

src/Config/TypeWithOutputFieldsDefinition.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ protected function outputFieldsSection(): NodeDefinition
1818
$node->isRequired()->requiresAtLeastOneElement();
1919

2020
$prototype = $node->useAttributeAsKey('name', false)->prototype('array');
21-
$this->resolverNormalization($prototype, 'resolver', 'resolve');
21+
$this->callbackNormalization($prototype, 'resolver', 'resolve');
2222

2323
/** @phpstan-ignore-next-line */
2424
$prototype
@@ -69,7 +69,7 @@ protected function outputFieldsSection(): NodeDefinition
6969
->end()
7070
->end()
7171
->end()
72-
->append($this->resolverSection('resolver', 'GraphQL value resolver'))
72+
->append($this->callbackSection('resolver', 'GraphQL value resolver'))
7373
->append($this->descriptionSection())
7474
->append($this->deprecationReasonSection())
7575
->variableNode('access')

src/Config/UnionTypeDefinition.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public function getDefinition(): ArrayNodeDefinition
1212
{
1313
/** @var ArrayNodeDefinition $node */
1414
$node = self::createNode('_union_config');
15-
$this->resolverNormalization($node, 'typeResolver', 'resolveType');
15+
$this->callbackNormalization($node, 'typeResolver', 'resolveType');
1616

1717
/** @phpstan-ignore-next-line */
1818
$node
@@ -25,7 +25,7 @@ public function getDefinition(): ArrayNodeDefinition
2525
->isRequired()
2626
->requiresAtLeastOneElement()
2727
->end()
28-
->append($this->resolverSection('typeResolver', 'GraphQL type resolver'))
28+
->append($this->callbackSection('typeResolver', 'GraphQL type resolver'))
2929
->append($this->descriptionSection())
3030
->end();
3131

src/DependencyInjection/Compiler/GraphQLServicesPass.php

-81
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
99
use Symfony\Component\DependencyInjection\ContainerBuilder;
1010
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
11-
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
1211
use Symfony\Component\DependencyInjection\Reference;
1312
use function is_string;
1413
use function sprintf;
@@ -20,8 +19,6 @@ final class GraphQLServicesPass implements CompilerPassInterface
2019
*/
2120
public function process(ContainerBuilder $container): void
2221
{
23-
$this->tagAllNotTaggedGraphQLServices($container);
24-
2522
$taggedServices = $container->findTaggedServiceIds('overblog_graphql.service', true);
2623

2724
// TODO: remove following if-block in 1.0
@@ -66,82 +63,4 @@ public function process(ContainerBuilder $container): void
6663

6764
$container->findDefinition(GraphQLServices::class)->addArgument(array_unique($locateableServices));
6865
}
69-
70-
private function tagAllNotTaggedGraphQLServices(ContainerBuilder $container): void
71-
{
72-
if (!$container->hasParameter('overblog_graphql_types.config')) {
73-
return;
74-
}
75-
/** @var array $configs */
76-
$configs = $container->getParameter('overblog_graphql_types.config');
77-
foreach ($configs as &$typeConfig) {
78-
switch ($typeConfig['type']) {
79-
case 'object':
80-
if (isset($typeConfig['config']['fieldResolver'])) {
81-
$this->resolveServiceIdAndMethod($container, $typeConfig['config']['fieldResolver']);
82-
}
83-
84-
foreach ($typeConfig['config']['fields'] as &$field) {
85-
if (isset($field['resolver'])) {
86-
$this->resolveServiceIdAndMethod($container, $field['resolver']);
87-
}
88-
}
89-
break;
90-
91-
case 'interface':
92-
case 'union':
93-
if (isset($typeConfig['config']['typeResolver'])) {
94-
$this->resolveServiceIdAndMethod($container, $typeConfig['config']['typeResolver']);
95-
}
96-
break;
97-
}
98-
}
99-
$container->setParameter('overblog_graphql_types.config', $configs);
100-
}
101-
102-
private function resolveServiceIdAndMethod(ContainerBuilder $container, ?array &$resolver): void
103-
{
104-
if (!isset($resolver['id']) && !isset($resolver['method'])) {
105-
return;
106-
}
107-
$originalId = $resolver['id'] ?? null;
108-
$originalMethod = $resolver['method'] ?? null;
109-
110-
if (null === $originalId) {
111-
[$id, $method] = explode('::', $originalMethod, 2) + [null, null];
112-
$throw = false;
113-
} else {
114-
$id = $originalId;
115-
$method = $originalMethod;
116-
$throw = true;
117-
}
118-
119-
try {
120-
$definition = $container->getDefinition($id);
121-
} catch (ServiceNotFoundException $e) {
122-
// get Alias real service ID
123-
try {
124-
$alias = $container->getAlias($id);
125-
$id = (string) $alias;
126-
$definition = $container->getDefinition($id);
127-
} catch (ServiceNotFoundException | InvalidArgumentException $e) {
128-
if ($throw) {
129-
throw $e;
130-
}
131-
$resolver['id'] = null;
132-
$resolver['method'] = $originalMethod;
133-
134-
return;
135-
}
136-
}
137-
if (
138-
!$definition->hasTag('overblog_graphql.service')
139-
&& !$definition->hasTag('overblog_graphql.global_variable')
140-
) {
141-
$definition->addTag('overblog_graphql.service');
142-
}
143-
144-
$resolver['id'] = $id;
145-
$resolver['method'] = $method;
146-
}
14766
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Overblog\GraphQLBundle\DependencyInjection\Compiler;
6+
7+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
8+
use Symfony\Component\DependencyInjection\ContainerBuilder;
9+
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
10+
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
11+
12+
final class IdentifyCallbackServiceIdsPass implements CompilerPassInterface
13+
{
14+
/**
15+
* {@inheritdoc}
16+
*/
17+
public function process(ContainerBuilder $container): void
18+
{
19+
if (!$container->hasParameter('overblog_graphql_types.config')) {
20+
return;
21+
}
22+
/** @var array $configs */
23+
$configs = $container->getParameter('overblog_graphql_types.config');
24+
foreach ($configs as &$typeConfig) {
25+
switch ($typeConfig['type']) {
26+
case 'object':
27+
if (isset($typeConfig['config']['fieldResolver'])) {
28+
$this->resolveServiceIdAndMethod($container, $typeConfig['config']['fieldResolver']);
29+
}
30+
31+
foreach ($typeConfig['config']['fields'] as &$field) {
32+
if (isset($field['resolver'])) {
33+
$this->resolveServiceIdAndMethod($container, $field['resolver']);
34+
}
35+
}
36+
break;
37+
38+
case 'interface':
39+
case 'union':
40+
if (isset($typeConfig['config']['typeResolver'])) {
41+
$this->resolveServiceIdAndMethod($container, $typeConfig['config']['typeResolver']);
42+
}
43+
break;
44+
}
45+
}
46+
$container->setParameter('overblog_graphql_types.config', $configs);
47+
}
48+
49+
private function resolveServiceIdAndMethod(ContainerBuilder $container, ?array &$callback): void
50+
{
51+
if (!isset($callback['id']) && !isset($callback['method'])) {
52+
return;
53+
}
54+
$originalId = $callback['id'] ?? null;
55+
$originalMethod = $callback['method'] ?? null;
56+
57+
if (null === $originalId) {
58+
[$id, $method] = explode('::', $originalMethod, 2) + [null, null];
59+
$throw = false;
60+
} else {
61+
$id = $originalId;
62+
$method = $originalMethod;
63+
$throw = true;
64+
}
65+
66+
try {
67+
$definition = $container->getDefinition($id);
68+
} catch (ServiceNotFoundException $e) {
69+
// get Alias real service ID
70+
try {
71+
$alias = $container->getAlias($id);
72+
$id = (string) $alias;
73+
$definition = $container->getDefinition($id);
74+
} catch (ServiceNotFoundException | InvalidArgumentException $e) {
75+
if ($throw) {
76+
throw $e;
77+
}
78+
$callback['id'] = null;
79+
$callback['method'] = $originalMethod;
80+
81+
return;
82+
}
83+
}
84+
if (
85+
!$definition->hasTag('overblog_graphql.service')
86+
&& !$definition->hasTag('overblog_graphql.global_variable')
87+
) {
88+
$definition->addTag('overblog_graphql.service');
89+
}
90+
91+
$callback['id'] = $id;
92+
$callback['method'] = $method;
93+
}
94+
}

src/OverblogGraphQLBundle.php

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ConfigParserPass;
99
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ExpressionFunctionPass;
1010
use Overblog\GraphQLBundle\DependencyInjection\Compiler\GraphQLServicesPass;
11+
use Overblog\GraphQLBundle\DependencyInjection\Compiler\IdentifyCallbackServiceIdsPass;
1112
use Overblog\GraphQLBundle\DependencyInjection\Compiler\MutationTaggedServiceMappingTaggedPass;
1213
use Overblog\GraphQLBundle\DependencyInjection\Compiler\QueryTaggedServiceMappingPass;
1314
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ResolverMapTaggedServiceMappingPass;
@@ -39,6 +40,7 @@ public function build(ContainerBuilder $container): void
3940

4041
//TypeGeneratorPass must be before TypeTaggedServiceMappingPass
4142
$container->addCompilerPass(new ConfigParserPass());
43+
$container->addCompilerPass(new IdentifyCallbackServiceIdsPass());
4244
$container->addCompilerPass(new GraphQLServicesPass());
4345
$container->addCompilerPass(new ExpressionFunctionPass());
4446
$container->addCompilerPass(new ResolverMethodAliasesPass());

src/Relay/Node/NodeDefinition.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,20 @@ final class NodeDefinition implements MappingInterface
1111
public function toMappingDefinition(array $config): array
1212
{
1313
$name = $config['name'];
14-
$resolveType = empty($config['resolveType']) ? null : $config['resolveType'];
1514

1615
return [
1716
$name => [
1817
'type' => 'interface',
1918
'config' => [
20-
'name' => $config['name'],
19+
'name' => $name,
2120
'description' => 'Fetches an object given its ID',
2221
'fields' => [
2322
'id' => [
2423
'type' => 'ID!',
2524
'description' => 'The ID of an object',
2625
],
2726
],
28-
'resolveType' => $resolveType,
27+
'typeResolver' => $config['typeResolver'] ?? $config['resolveType'] ?? null,
2928
],
3029
],
3130
];

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

+6-3
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ User:
1616
friends:
1717
type: friendConnection
1818
argsBuilder: "Relay::Connection"
19-
resolver: 'overblog_graphql.test.resolver.node::friendsResolver'
19+
resolver:
20+
method: 'overblog_graphql.test.resolver.node::friendsResolver'
2021
friendsForward:
2122
type: userConnection
2223
argsBuilder: "Relay::ForwardConnection"
23-
resolver: 'overblog_graphql.test.resolver.node::friendsResolver'
24+
resolver:
25+
id: 'overblog_graphql.test.resolver.node'
26+
method: 'friendsResolver'
2427
friendsBackward:
2528
type: userConnection
2629
argsBuilder: "Relay::BackwardConnection"
@@ -38,7 +41,7 @@ friendConnection:
3841
connectionFields:
3942
totalCount:
4043
type: Int
41-
resolve: '@=query("connection")'
44+
resolver: '@=query("connection")'
4245

4346
userConnection:
4447
type: relay-connection

0 commit comments

Comments
 (0)