Skip to content

Commit 759f030

Browse files
author
Jeremiah VALERIE
committed
wip
1 parent c91bbc9 commit 759f030

File tree

10 files changed

+114
-97
lines changed

10 files changed

+114
-97
lines changed

src/Config/InterfaceTypeDefinition.php

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 0 additions & 81 deletions
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
$locateableServices = [];
@@ -56,82 +53,4 @@ public function process(ContainerBuilder $container): void
5653

5754
$container->findDefinition(GraphQLServices::class)->addArgument(array_unique($locateableServices));
5855
}
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;
136-
}
13756
}
Lines changed: 94 additions & 0 deletions
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

Lines changed: 2 additions & 0 deletions
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;
@@ -38,6 +39,7 @@ public function build(ContainerBuilder $container): void
3839

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

src/Relay/Node/NodeDefinition.php

Lines changed: 2 additions & 3 deletions
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

Lines changed: 6 additions & 3 deletions
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)