vendor/overblog/graphql-bundle/src/Definition/Builder/SchemaBuilder.php line 40

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Overblog\GraphQLBundle\Definition\Builder;
  4. use Closure;
  5. use GraphQL\Type\Definition\Type;
  6. use Overblog\GraphQLBundle\Definition\Type\ExtensibleSchema;
  7. use Overblog\GraphQLBundle\Definition\Type\SchemaExtension\ValidatorExtension;
  8. use Overblog\GraphQLBundle\Resolver\TypeResolver;
  9. use function array_map;
  10. class SchemaBuilder
  11. {
  12. private TypeResolver $typeResolver;
  13. private bool $enableValidation;
  14. public function __construct(TypeResolver $typeResolver, bool $enableValidation = false)
  15. {
  16. $this->typeResolver = $typeResolver;
  17. $this->enableValidation = $enableValidation;
  18. }
  19. public function getBuilder(string $name, ?string $queryAlias, ?string $mutationAlias = null, ?string $subscriptionAlias = null, array $types = []): Closure
  20. {
  21. return function () use ($name, $queryAlias, $mutationAlias, $subscriptionAlias, $types): ExtensibleSchema {
  22. static $schema = null;
  23. if (null === $schema) {
  24. $schema = $this->create($name, $queryAlias, $mutationAlias, $subscriptionAlias, $types);
  25. }
  26. return $schema;
  27. };
  28. }
  29. /**
  30. * @param string[] $types
  31. */
  32. public function create(string $name, ?string $queryAlias, ?string $mutationAlias = null, ?string $subscriptionAlias = null, array $types = []): ExtensibleSchema
  33. {
  34. $this->typeResolver->setCurrentSchemaName($name);
  35. $query = $this->typeResolver->resolve($queryAlias);
  36. $mutation = $this->typeResolver->resolve($mutationAlias);
  37. $subscription = $this->typeResolver->resolve($subscriptionAlias);
  38. $schema = new ExtensibleSchema($this->buildSchemaArguments($name, $query, $mutation, $subscription, $types));
  39. $extensions = [];
  40. if ($this->enableValidation) {
  41. $extensions[] = new ValidatorExtension();
  42. }
  43. $schema->setExtensions($extensions);
  44. return $schema;
  45. }
  46. private function buildSchemaArguments(string $schemaName, Type $query, ?Type $mutation, ?Type $subscription, array $types = []): array
  47. {
  48. return [
  49. 'query' => $query,
  50. 'mutation' => $mutation,
  51. 'subscription' => $subscription,
  52. 'typeLoader' => function ($name) use ($schemaName) {
  53. $this->typeResolver->setCurrentSchemaName($schemaName);
  54. return $this->typeResolver->resolve($name);
  55. },
  56. 'types' => function () use ($types, $schemaName) {
  57. $this->typeResolver->setCurrentSchemaName($schemaName);
  58. return array_map([$this->typeResolver, 'resolve'], $types);
  59. },
  60. ];
  61. }
  62. }