Skip to content

Commit 215c7d4

Browse files
author
Vladyslav Lyshenko
committed
fix: resettable schemas
1 parent 7020546 commit 215c7d4

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

src/Definition/Builder/SchemaBuilder.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
use Overblog\GraphQLBundle\Definition\Type\SchemaExtension\ValidatorExtension;
1111
use Overblog\GraphQLBundle\Resolver\TypeResolver;
1212

13+
use Symfony\Contracts\Service\ResetInterface;
1314
use function array_map;
1415

15-
final class SchemaBuilder
16+
final class SchemaBuilder implements ResetInterface
1617
{
1718
private TypeResolver $typeResolver;
1819
private bool $enableValidation;
20+
private array $builders = [];
1921

2022
public function __construct(TypeResolver $typeResolver, bool $enableValidation = false)
2123
{
@@ -26,12 +28,11 @@ public function __construct(TypeResolver $typeResolver, bool $enableValidation =
2628
public function getBuilder(string $name, ?string $queryAlias, string $mutationAlias = null, string $subscriptionAlias = null, array $types = [], bool $resettable = false): Closure
2729
{
2830
return function () use ($name, $queryAlias, $mutationAlias, $subscriptionAlias, $types, $resettable): ExtensibleSchema {
29-
static $schema = null;
30-
if (null === $schema) {
31-
$schema = $this->create($name, $queryAlias, $mutationAlias, $subscriptionAlias, $types, $resettable);
31+
if (!isset($this->builders[$name])) {
32+
$this->builders[$name] = $this->create($name, $queryAlias, $mutationAlias, $subscriptionAlias, $types, $resettable);
3233
}
3334

34-
return $schema;
35+
return $this->builders[$name];
3536
};
3637
}
3738

@@ -75,4 +76,12 @@ private function buildSchemaArguments(string $schemaName, Type $query, ?Type $mu
7576
},
7677
];
7778
}
79+
80+
public function reset(): void
81+
{
82+
$this->builders = array_filter(
83+
$this->builders,
84+
fn (ExtensibleSchema $schema) => false === $schema->isResettable()
85+
);
86+
}
7887
}

src/Resolver/AbstractResolver.php

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@
44

55
namespace Overblog\GraphQLBundle\Resolver;
66

7+
use Symfony\Contracts\Service\ResetInterface;
78
use function array_keys;
89

9-
abstract class AbstractResolver implements FluentResolverInterface
10+
abstract class AbstractResolver implements FluentResolverInterface, ResetInterface
1011
{
12+
private array $solutionsFactory = [];
1113
private array $solutions = [];
1214
private array $aliases = [];
1315
private array $solutionOptions = [];
14-
private array $fullyLoadedSolutions = [];
1516

1617
public function addSolution(string $id, callable $factory, array $aliases = [], array $options = []): self
1718
{
18-
$this->fullyLoadedSolutions[$id] = false;
1919
$this->addAliases($id, $aliases);
2020

21-
$this->solutions[$id] = $factory;
21+
$this->solutionsFactory[$id] = $factory;
2222
$this->solutionOptions[$id] = $options;
2323

2424
return $this;
@@ -28,7 +28,7 @@ public function hasSolution(string $id): bool
2828
{
2929
$id = $this->resolveAlias($id);
3030

31-
return isset($this->solutions[$id]);
31+
return isset($this->solutionsFactory[$id]);
3232
}
3333

3434
/**
@@ -81,13 +81,12 @@ private function loadSolution(string $id)
8181
return null;
8282
}
8383

84-
if ($this->fullyLoadedSolutions[$id]) {
84+
if (isset($this->solutions[$id])) {
8585
return $this->solutions[$id];
8686
} else {
87-
$loader = $this->solutions[$id];
87+
$loader = $this->solutionsFactory[$id];
8888
$this->solutions[$id] = $solution = $loader();
8989
$this->onLoadSolution($solution);
90-
$this->fullyLoadedSolutions[$id] = true;
9190

9291
return $solution;
9392
}
@@ -110,10 +109,15 @@ private function resolveAlias(string $alias): string
110109
*/
111110
private function loadSolutions(): array
112111
{
113-
foreach ($this->solutions as $name => &$solution) {
114-
$solution = $this->loadSolution($name);
112+
foreach (array_keys($this->solutionsFactory) as $name) {
113+
$this->loadSolution($name);
115114
}
116115

117116
return $this->solutions;
118117
}
118+
119+
public function reset(): void
120+
{
121+
$this->solutions = [];
122+
}
119123
}

src/Resolver/TypeResolver.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,11 @@ protected function supportedSolutionClass(): ?string
8787
{
8888
return Type::class;
8989
}
90+
91+
public function reset(): void
92+
{
93+
parent::reset();
94+
95+
$this->cache = [];
96+
}
9097
}

src/Resources/config/services.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ services:
2828
arguments:
2929
- '@Overblog\GraphQLBundle\Resolver\TypeResolver'
3030
- false
31+
tags:
32+
- { name: 'kernel.reset', 'method': "reset" }
3133

3234
Overblog\GraphQLBundle\Definition\Builder\TypeFactory:
3335
arguments:
@@ -39,6 +41,7 @@ services:
3941
- ['setDispatcher', ['@event_dispatcher']]
4042
tags:
4143
- { name: overblog_graphql.service, alias: typeResolver }
44+
- {name: 'kernel.reset', 'method': "reset"}
4245

4346
Overblog\GraphQLBundle\Transformer\ArgumentsTransformer:
4447
arguments:

0 commit comments

Comments
 (0)