Skip to content

Commit be9ec1e

Browse files
author
Jeremiah VALERIE
committed
add PluralIdentifyingRootField
1 parent 6eafb3d commit be9ec1e

File tree

4 files changed

+91
-21
lines changed

4 files changed

+91
-21
lines changed

DependencyInjection/Configuration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ private function addFieldsSelection($name, $enabledBuilder = true)
161161
->scalarNode('typeName')->end()
162162
->scalarNode('idFetcher')->end()
163163
->scalarNode('typeResolver')->end()
164+
->scalarNode('argName')->end()
165+
->scalarNode('inputType')->end()
166+
->scalarNode('outputType')->end()
167+
->scalarNode('resolveSingleInput')->end()
168+
->scalarNode('description')->end()
164169
->end()
165170
->end();
166171
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace Overblog\GraphBundle\Relay\Node;
4+
5+
use GraphQL\Type\Definition\Config;
6+
use GraphQL\Type\Definition\Type;
7+
use GraphQL\Utils;
8+
use Overblog\GraphBundle\Definition\FieldInterface;
9+
10+
class PluralIdentifyingRootField implements FieldInterface
11+
{
12+
public function toFieldsDefinition(array $config)
13+
{
14+
Config::validate($config, [
15+
'name' => Config::STRING,
16+
'argName' => Config::STRING | Config::REQUIRED,
17+
'inputType' => Config::OBJECT_TYPE | Config::CALLBACK | Config::REQUIRED,
18+
'outputType' => Config::OBJECT_TYPE | Config::CALLBACK | Config::REQUIRED,
19+
'resolveSingleInput' => Config::CALLBACK | Config::REQUIRED,
20+
'description' => Config::STRING
21+
]);
22+
23+
$inputArgs[$config['argName']] = [
24+
'type' => Type::nonNull (
25+
Type::listOf(
26+
Type::nonNull($config['inputType'])
27+
)
28+
)
29+
];
30+
31+
return [
32+
'name' => $config['name'],
33+
'description' => isset($config['description']) ? $config['description'] : null,
34+
'type' => Type::listOf($config['outputType']),
35+
'args' => $inputArgs,
36+
'resolve' => function($obj, $args, $info) use($config) {
37+
$inputs = $args[$config['argName']];
38+
39+
$data = [];
40+
41+
foreach ($inputs as $input) {
42+
$data[$input] = is_callable($config['resolveSingleInput'])?
43+
call_user_func_array($config['resolveSingleInput'], [$input, $info]):
44+
null;
45+
}
46+
47+
return $data;
48+
}
49+
];
50+
}
51+
}

Resolver/ConfigResolver.php

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,9 @@ class ConfigResolver implements ResolverInterface
2929
/** @var boolean */
3030
private $enabledDebug;
3131

32-
// [name => method]
33-
private $resolverMap = [
34-
'fields' => 'resolveFields',
35-
'isTypeOf' => 'resolveResolveCallback',
36-
'interfaces' => 'resolveInterfaces',
37-
'types' => 'resolveTypes',
38-
'values' => 'resolveValues',
39-
'resolveType' => 'resolveResolveCallback',
40-
'resolveCursor' => 'resolveResolveCallback',
41-
'resolveNode' => 'resolveResolveCallback',
42-
'nodeType' => 'resolveTypeCallback',
43-
'connectionFields' => 'resolveFields',
44-
'edgeFields' => 'resolveFields',
45-
'outputFields' => 'resolveFields',
46-
'inputFields' => 'resolveFields',
47-
'mutateAndGetPayload' => 'resolveResolveCallback',
48-
'idFetcher' => 'resolveResolveCallback',
49-
'nodeInterfaceType' => 'resolveTypeCallback',
50-
];
32+
/** @var array */
33+
// [name => callable]
34+
private $resolverMap = [];
5135

5236
public function __construct(
5337
ResolverInterface $typeResolver,
@@ -60,6 +44,32 @@ public function __construct(
6044
$this->fieldResolver = $fieldResolver;
6145
$this->expressionLanguage = $expressionLanguage;
6246
$this->enabledDebug = $enabledDebug;
47+
$this->resolverMap = [
48+
'fields' => [$this, 'resolveFields'],
49+
'isTypeOf' => [$this, 'resolveResolveCallback'],
50+
'interfaces' => [$this, 'resolveInterfaces'],
51+
'types' => [$this, 'resolveTypes'],
52+
'values' => [$this, 'resolveValues'],
53+
'resolveType' => [$this, 'resolveResolveCallback'],
54+
'resolveCursor' => [$this, 'resolveResolveCallback'],
55+
'resolveNode' => [$this, 'resolveResolveCallback'],
56+
'nodeType' => [$this, 'resolveTypeCallback'],
57+
'connectionFields' => [$this, 'resolveFields'],
58+
'edgeFields' => [$this, 'resolveFields'],
59+
'outputFields' => [$this, 'resolveFields'],
60+
'inputFields' => [$this, 'resolveFields'],
61+
'mutateAndGetPayload' => [$this, 'resolveResolveCallback'],
62+
'idFetcher' => [$this, 'resolveResolveCallback'],
63+
'nodeInterfaceType' => [$this, 'resolveTypeCallback'],
64+
'inputType' => [$this, 'resolveTypeCallback'],
65+
'outputType' => [$this, 'resolveTypeCallback'],
66+
'resolveSingleInput' => [$this, 'resolveResolveCallback'],
67+
];
68+
}
69+
70+
public function addResolverMap($name, callable $resolver)
71+
{
72+
$this->resolverMap[$name] = $resolver;
6373
}
6474

6575
public function resolve($config)
@@ -72,8 +82,7 @@ public function resolve($config)
7282
if (!isset($this->resolverMap[$name]) || empty($values)) {
7383
continue;
7484
}
75-
$resolverMethod = $this->resolverMap[$name];
76-
$values = $this->$resolverMethod($values);
85+
$values = call_user_func_array($this->resolverMap[$name], [$values]);
7786
}
7887

7988
return $config;

Resources/config/graphql_fields.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,8 @@ services:
1919
class: Overblog\GraphBundle\Relay\Node\NodeField
2020
tags:
2121
- { name: overblog_graph.field, alias: Node }
22+
23+
overblog_graph.definition.relay_node_plurial_identifying_root_field:
24+
class: Overblog\GraphBundle\Relay\Node\PluralIdentifyingRootField
25+
tags:
26+
- { name: overblog_graph.field, alias: PluralIdentifyingRoot }

0 commit comments

Comments
 (0)