Passed
Pull Request — master (#299)
by Christoffer
02:51
created

ResolverRegistry   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 111
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 35
dl 0
loc 111
rs 10
c 0
b 0
f 0
wmc 14

7 Methods

Rating   Name   Duplication   Size   Complexity  
A getTypeResolver() 0 9 2
A getFieldResolver() 0 21 5
A registerResolvers() 0 8 3
A applyMiddleware() 0 13 1
A getResolver() 0 3 1
A register() 0 3 1
A __construct() 0 5 1
1
<?php
2
3
namespace Digia\GraphQL\Schema\Resolver;
4
5
use Digia\GraphQL\Execution\ResolveInfo;
6
7
class ResolverRegistry implements ResolverRegistryInterface
8
{
9
    /**
10
     * @var ResolverInterface[]
11
     */
12
    protected $resolverMap;
13
14
    /**
15
     * @var ResolverMiddlewareInterface[]
16
     */
17
    protected $middleware;
18
19
    /**
20
     * ResolverMapRegistry constructor.
21
     * @param array $resolvers
22
     */
23
    public function __construct(array $resolvers = [], array $middleware = [])
24
    {
25
        $this->middleware = $middleware;
26
27
        $this->registerResolvers($resolvers);
28
    }
29
30
    /**
31
     * @inheritdoc
32
     */
33
    public function register(string $typeName, ResolverInterface $resolver): void
34
    {
35
        $this->resolverMap[$typeName] = $resolver;
36
    }
37
38
    /**
39
     * @inheritdoc
40
     */
41
    public function getFieldResolver(string $typeName, string $fieldName): ?callable
42
    {
43
        $resolver = $this->getResolver($typeName);
44
45
        if (null === $resolver) {
46
            return null;
47
        }
48
49
        $resolver = $resolver instanceof ResolverCollection
50
            ? $resolver->getResolver($fieldName)
51
            : $resolver;
52
53
        $resolveCallback = $resolver instanceof ResolverInterface
54
            ? $resolver->getResolveCallback()
55
            : $resolver;
56
57
        if (!empty($this->middleware)) {
58
            return $this->applyMiddleware($resolveCallback, \array_reverse($this->middleware));
0 ignored issues
show
Bug introduced by
It seems like $resolveCallback can also be of type null; however, parameter $resolveCallback of Digia\GraphQL\Schema\Res...stry::applyMiddleware() does only seem to accept callable, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

58
            return $this->applyMiddleware(/** @scrutinizer ignore-type */ $resolveCallback, \array_reverse($this->middleware));
Loading history...
59
        }
60
61
        return $resolveCallback;
62
    }
63
64
    /**
65
     * @inheritdoc
66
     */
67
    public function getTypeResolver(string $typeName): ?callable
68
    {
69
        $resolver = $this->getResolver($typeName);
70
71
        if ($resolver instanceof ResolverInterface) {
72
            return $resolver->getTypeResolver();
73
        }
74
75
        return null;
76
    }
77
78
    /**
79
     * @inheritdoc
80
     */
81
    public function getResolver(string $typeName): ?ResolverInterface
82
    {
83
        return $this->resolverMap[$typeName] ?? null;
84
    }
85
86
    /**
87
     * @param array $resolvers
88
     */
89
    protected function registerResolvers(array $resolvers): void
90
    {
91
        foreach ($resolvers as $typeName => $resolver) {
92
            if (\is_array($resolver)) {
93
                $resolver = new ResolverCollection($resolver);
94
            }
95
96
            $this->register($typeName, $resolver);
97
        }
98
    }
99
100
    /**
101
     * @param callable $resolveCallback
102
     * @param array    $middleware
103
     * @return callable
104
     */
105
    protected function applyMiddleware(callable $resolveCallback, array $middleware): callable
106
    {
107
        return \array_reduce(
108
            $middleware,
109
            function (callable $resolveCallback, ResolverMiddlewareInterface $middleware) {
110
                return function ($rootValue, array $args, $contextValues = null, ?ResolveInfo $info = null) use (
111
                    $resolveCallback,
112
                    $middleware
113
                ) {
114
                    return $middleware->resolve($resolveCallback, $rootValue, $args, $contextValues, $info);
115
                };
116
            },
117
            $resolveCallback
118
        );
119
    }
120
}
121