Skip to content
This repository was archived by the owner on Mar 8, 2023. It is now read-only.

Commit 4934b63

Browse files
authored
Reintroduce type resolvers (#301)
1 parent c851830 commit 4934b63

File tree

7 files changed

+120
-52
lines changed

7 files changed

+120
-52
lines changed

src/Schema/Resolver/AbstractResolver.php renamed to src/Schema/Resolver/AbstractFieldResolver.php

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
use Digia\GraphQL\Execution\ResolveInfo;
66

7-
abstract class AbstractResolver implements ResolverInterface
7+
abstract class AbstractFieldResolver implements ResolverInterface
88
{
9+
use ResolverTrait;
10+
911
/**
1012
* @param mixed $rootValue
1113
* @param array $arguments
@@ -32,34 +34,4 @@ public function getResolveCallback(): ?callable
3234
return $this->resolve($rootValue, $arguments, $context, $info);
3335
};
3436
}
35-
36-
/**
37-
* @inheritdoc
38-
*/
39-
public function getTypeResolver(): ?callable
40-
{
41-
return function ($rootValue, $context = null, ?ResolveInfo $info = null) {
42-
return $this->resolveType($rootValue, $context, $info);
43-
};
44-
}
45-
46-
/**
47-
* @param mixed $rootValue
48-
* @param mixed $context
49-
* @param ResolveInfo|null $info
50-
* @return callable|null
51-
*/
52-
public function resolveType($rootValue, $context = null, ?ResolveInfo $info = null): ?callable
53-
{
54-
// Override this method when your resolver returns an interface or an union type.
55-
return null;
56-
}
57-
58-
/**
59-
* @inheritdoc
60-
*/
61-
public function getMiddleware(): ?array
62-
{
63-
return null;
64-
}
6537
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Digia\GraphQL\Schema\Resolver;
4+
5+
abstract class AbstractTypeResolver implements ResolverCollectionInterface
6+
{
7+
use ResolverTrait;
8+
9+
/**
10+
* @return callable|null
11+
*/
12+
public function getResolveCallback(): ?callable
13+
{
14+
return function (string $fieldName) {
15+
return $this->getResolver($fieldName);
16+
};
17+
}
18+
19+
/**
20+
* @param string $fieldName
21+
* @return callable|null
22+
*/
23+
public function getResolver(string $fieldName): ?callable
24+
{
25+
$resolveMethod = 'resolve' . \ucfirst($fieldName);
26+
27+
if (\method_exists($this, $resolveMethod)) {
28+
return [$this, $resolveMethod];
29+
}
30+
31+
return null;
32+
}
33+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Digia\GraphQL\Schema\Resolver;
4+
5+
interface ResolverCollectionInterface extends ResolverInterface
6+
{
7+
/**
8+
* @param string $fieldName
9+
* @return callable|null
10+
*/
11+
public function getResolver(string $fieldName): ?callable;
12+
}

src/Schema/Resolver/ResolverCollection.php renamed to src/Schema/Resolver/ResolverMap.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Digia\GraphQL\Schema\Resolver;
44

5-
class ResolverCollection implements ResolverInterface
5+
class ResolverMap implements ResolverCollectionInterface
66
{
77
protected const TYPE_RESOLVER_KEY = '__resolveType';
88

@@ -43,7 +43,7 @@ public function getResolver(string $fieldName): ?callable
4343
*/
4444
public function getResolveCallback(): ?callable
4545
{
46-
return function ($fieldName) {
46+
return function (string $fieldName) {
4747
$resolver = $this->getResolver($fieldName);
4848

4949
return $resolver instanceof ResolverInterface
@@ -75,7 +75,7 @@ protected function registerResolvers(array $resolvers): void
7575
{
7676
foreach ($resolvers as $typeName => $resolver) {
7777
if (\is_array($resolver)) {
78-
$resolver = new ResolverCollection($resolver);
78+
$resolver = new ResolverMap($resolver);
7979
}
8080

8181
$this->addResolver($typeName, $resolver);

src/Schema/Resolver/ResolverRegistry.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function getFieldResolver(string $typeName, string $fieldName): ?callable
4343
{
4444
$resolver = $this->getResolver($typeName);
4545

46-
$resolver = $resolver instanceof ResolverCollection
46+
$resolver = $resolver instanceof ResolverCollectionInterface
4747
? $resolver->getResolver($fieldName)
4848
: $resolver;
4949

@@ -95,7 +95,7 @@ protected function registerResolvers(array $resolvers): void
9595
{
9696
foreach ($resolvers as $typeName => $resolver) {
9797
if (\is_array($resolver)) {
98-
$resolver = new ResolverCollection($resolver);
98+
$resolver = new ResolverMap($resolver);
9999
}
100100

101101
$this->register($typeName, $resolver);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Digia\GraphQL\Schema\Resolver;
4+
5+
use Digia\GraphQL\Execution\ResolveInfo;
6+
7+
trait ResolverTrait
8+
{
9+
/**
10+
* @return callable|null
11+
*/
12+
public function getTypeResolver(): ?callable
13+
{
14+
return function ($rootValue, $context = null, ?ResolveInfo $info = null) {
15+
return $this->resolveType($rootValue, $context, $info);
16+
};
17+
}
18+
19+
/**
20+
* @param mixed $rootValue
21+
* @param mixed $context
22+
* @param ResolveInfo|null $info
23+
* @return callable|null
24+
*/
25+
public function resolveType($rootValue, $context = null, ?ResolveInfo $info = null): ?callable
26+
{
27+
// Override this method when your resolver returns an interface or an union type.
28+
return null;
29+
}
30+
31+
/**
32+
* @return array|null
33+
*/
34+
public function getMiddleware(): ?array
35+
{
36+
return null;
37+
}
38+
}

tests/Unit/Schema/Resolver/ResolverRegistryTest.php

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
namespace Digia\GraphQL\Test\Unit\Schema\Resolver;
44

55
use Digia\GraphQL\Execution\ResolveInfo;
6-
use Digia\GraphQL\Schema\Resolver\AbstractObjectResolver;
7-
use Digia\GraphQL\Schema\Resolver\AbstractResolver;
8-
use Digia\GraphQL\Schema\Resolver\AbstractResolverMiddleware;
9-
use Digia\GraphQL\Schema\Resolver\ResolverCollection;
6+
use Digia\GraphQL\Schema\Resolver\AbstractTypeResolver;
7+
use Digia\GraphQL\Schema\Resolver\AbstractFieldResolver;
108
use Digia\GraphQL\Schema\Resolver\ResolverMiddlewareInterface;
119
use Digia\GraphQL\Schema\Resolver\ResolverRegistry;
1210
use Digia\GraphQL\Test\TestCase;
@@ -16,7 +14,7 @@
1614

1715
class ResolverRegistryTest extends TestCase
1816
{
19-
public function testArrayResolver()
17+
public function testResolverMap()
2018
{
2119
$registry = new ResolverRegistry([
2220
'Query' => [
@@ -40,7 +38,19 @@ public function testArrayResolver()
4038
], $registry->getFieldResolver('Query', 'droid')(null, ['id' => '2001']));
4139
}
4240

43-
public function testResolverClassMap()
41+
public function testTypeResolver()
42+
{
43+
$registry = new ResolverRegistry([
44+
'Query' => new QueryResolver(),
45+
]);
46+
47+
/** @noinspection PhpUnhandledExceptionInspection */
48+
$this->assertArraySubset([
49+
'name' => 'Luke Skywalker',
50+
], $registry->getFieldResolver('Query', 'human')(null, ['id' => '1000']));
51+
}
52+
53+
public function testFieldResolver()
4454
{
4555
$registry = new ResolverRegistry([
4656
'Query' => [
@@ -58,9 +68,7 @@ public function testRegisterResolver()
5868
{
5969
$registry = new ResolverRegistry();
6070

61-
$registry->register('Query', new ResolverCollection([
62-
'human' => new HumanResolver(),
63-
]));
71+
$registry->register('Query', new QueryResolver());
6472

6573
/** @noinspection PhpUnhandledExceptionInspection */
6674
$this->assertArraySubset([
@@ -206,18 +214,23 @@ public function resolve(
206214
}
207215
}
208216

209-
class HumanResolver extends AbstractResolver
217+
class QueryResolver extends AbstractTypeResolver
210218
{
211-
/**
212-
* @inheritdoc
213-
*/
214-
public function resolve($rootValue, array $arguments, $context = null, ?ResolveInfo $info = null)
219+
public function resolveHuman($rootValue, array $arguments, $context = null, ?ResolveInfo $info = null): array
220+
{
221+
return getHuman($arguments['id']);
222+
}
223+
}
224+
225+
class HumanResolver extends AbstractFieldResolver
226+
{
227+
public function resolve($rootValue, array $arguments, $context = null, ?ResolveInfo $info = null): array
215228
{
216229
return getHuman($arguments['id']);
217230
}
218231
}
219232

220-
class HelloResolver extends AbstractResolver
233+
class HelloResolver extends AbstractFieldResolver
221234
{
222235
protected $logCallback;
223236

@@ -226,7 +239,7 @@ public function __construct(callable $logCallback)
226239
$this->logCallback = $logCallback;
227240
}
228241

229-
public function resolve($rootValue, array $arguments, $context = null, ?ResolveInfo $info = null)
242+
public function resolve($rootValue, array $arguments, $context = null, ?ResolveInfo $info = null): string
230243
{
231244
\call_user_func($this->logCallback, '3. resolver: hello');
232245
return \sprintf('Hello %s!', $arguments['name'] ?? 'world');

0 commit comments

Comments
 (0)