From b159083f0b4ea5f389d6c759ac6d39ec087f777d Mon Sep 17 00:00:00 2001 From: Marc Bischof Date: Mon, 30 Mar 2026 16:58:24 +0200 Subject: [PATCH] Skip re-validation of previously validated AST via assumeValidSDL https://webonyx.github.io/graphql-php/schema-definition-language/#performance-considerations --- Classes/Service/SchemaService.php | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Classes/Service/SchemaService.php b/Classes/Service/SchemaService.php index 913a52b..4944a7e 100644 --- a/Classes/Service/SchemaService.php +++ b/Classes/Service/SchemaService.php @@ -6,6 +6,7 @@ use GraphQL\Language\Parser; use GraphQL\Type\Schema; +use GraphQL\Utils\BuildSchema; use GraphQLTools\Generate\ConcatenateTypeDefs; use GraphQLTools\GraphQLTools; use GraphQLTools\SchemaDirectiveVisitor; @@ -205,12 +206,23 @@ protected function getMergedSchemaFromConfigurations(array $configuration): Sche if (count($options['typeDefs']) > 0) { $cacheIdentifier = md5(serialize($options['typeDefs'])); if ($this->schemaCache->has($cacheIdentifier)) { - $options['typeDefs'] = $this->schemaCache->get($cacheIdentifier); + $document = $this->schemaCache->get($cacheIdentifier); + $assumeValidSDL = true; // already validated when first cached } else { - $options['typeDefs'] = Parser::parse(ConcatenateTypeDefs::invoke($options['typeDefs'])); - $this->schemaCache->set($cacheIdentifier, $options['typeDefs']); + $document = Parser::parse(ConcatenateTypeDefs::invoke($options['typeDefs'])); + $this->schemaCache->set($cacheIdentifier, $document); + $assumeValidSDL = false; + } + + $builtSchema = BuildSchema::buildAST($document, null, ['assumeValidSDL' => $assumeValidSDL]); + $schema = GraphQLTools::addResolveFunctionsToSchema([ + 'schema' => $builtSchema, + 'resolvers' => $options['resolvers'], + 'resolverValidationOptions' => $options['resolverValidationOptions'], + ]); + if (! empty($options['schemaDirectives'])) { + SchemaDirectiveVisitor::visitSchemaDirectives($schema, $options['schemaDirectives']); } - $schema = GraphQLTools::makeExecutableSchema($options); } if ($schema) {