wait($promise); } /** * Same as executeQuery(), but requires PromiseAdapter and always returns a Promise. * Useful for Async PHP platforms. * * @api * @param string|DocumentNode $source * @param mixed $rootValue * @param mixed $context * @param mixed[]|null $variableValues * @param ValidationRule[]|null $validationRules */ public static function promiseToExecute( PromiseAdapter $promiseAdapter, SchemaType $schema, $source, $rootValue = null, $context = null, $variableValues = null, ?string $operationName = null, ?callable $fieldResolver = null, ?array $validationRules = null ) : Promise { try { if ($source instanceof DocumentNode) { $documentNode = $source; } else { $documentNode = Parser::parse(new Source($source ?: '', 'GraphQL')); } // FIXME if (empty($validationRules)) { /** @var QueryComplexity $queryComplexity */ $queryComplexity = DocumentValidator::getRule(QueryComplexity::class); $queryComplexity->setRawVariableValues($variableValues); } else { foreach ($validationRules as $rule) { if (! ($rule instanceof QueryComplexity)) { continue; } $rule->setRawVariableValues($variableValues); } } $validationErrors = DocumentValidator::validate($schema, $documentNode, $validationRules); if (! empty($validationErrors)) { return $promiseAdapter->createFulfilled( new ExecutionResult(null, $validationErrors) ); } return Executor::promiseToExecute( $promiseAdapter, $schema, $documentNode, $rootValue, $context, $variableValues, $operationName, $fieldResolver ); } catch (Error $e) { return $promiseAdapter->createFulfilled( new ExecutionResult(null, [$e]) ); } } /** * @deprecated Use executeQuery()->toArray() instead * * @param string|DocumentNode $source * @param mixed $rootValue * @param mixed $contextValue * @param mixed[]|null $variableValues * @return Promise|mixed[] */ public static function execute( SchemaType $schema, $source, $rootValue = null, $contextValue = null, $variableValues = null, ?string $operationName = null ) { trigger_error( __METHOD__ . ' is deprecated, use GraphQL::executeQuery()->toArray() as a quick replacement', E_USER_DEPRECATED ); $promiseAdapter = Executor::getPromiseAdapter(); $result = self::promiseToExecute( $promiseAdapter, $schema, $source, $rootValue, $contextValue, $variableValues, $operationName ); if ($promiseAdapter instanceof SyncPromiseAdapter) { $result = $promiseAdapter->wait($result)->toArray(); } else { $result = $result->then(function (ExecutionResult $r) { return $r->toArray(); }); } return $result; } /** * @deprecated renamed to executeQuery() * * @param string|DocumentNode $source * @param mixed $rootValue * @param mixed $contextValue * @param mixed[]|null $variableValues * * @return ExecutionResult|Promise */ public static function executeAndReturnResult( SchemaType $schema, $source, $rootValue = null, $contextValue = null, $variableValues = null, ?string $operationName = null ) { trigger_error( __METHOD__ . ' is deprecated, use GraphQL::executeQuery() as a quick replacement', E_USER_DEPRECATED ); $promiseAdapter = Executor::getPromiseAdapter(); $result = self::promiseToExecute( $promiseAdapter, $schema, $source, $rootValue, $contextValue, $variableValues, $operationName ); if ($promiseAdapter instanceof SyncPromiseAdapter) { $result = $promiseAdapter->wait($result); } return $result; } /** * Returns directives defined in GraphQL spec * * @api * @return Directive[] */ public static function getStandardDirectives() : array { return array_values(Directive::getInternalDirectives()); } /** * Returns types defined in GraphQL spec * * @api * @return Type[] */ public static function getStandardTypes() : array { return array_values(Type::getInternalTypes()); } /** * Returns standard validation rules implementing GraphQL spec * * @api * @return ValidationRule[] */ public static function getStandardValidationRules() : array { return array_values(DocumentValidator::defaultRules()); } public static function setDefaultFieldResolver(callable $fn) : void { Executor::setDefaultFieldResolver($fn); } public static function setPromiseAdapter(?PromiseAdapter $promiseAdapter = null) : void { Executor::setPromiseAdapter($promiseAdapter); } /** * Returns directives defined in GraphQL spec * * @deprecated Renamed to getStandardDirectives * @return Directive[] */ public static function getInternalDirectives() : array { return self::getStandardDirectives(); } }