mirror of
https://github.com/retailcrm/graphql-php.git
synced 2024-11-21 20:36:05 +03:00
Merge pull request #505 from spawnia/root-value-consistent-naming
Consistently name the first resolver argument and the root value
This commit is contained in:
commit
22a0da9b98
@ -152,7 +152,7 @@ class SchemaGenerator
|
||||
];
|
||||
}
|
||||
|
||||
public function resolveField($value, $args, $context, $resolveInfo)
|
||||
public function resolveField($objectValue, $args, $context, $resolveInfo)
|
||||
{
|
||||
return $resolveInfo->fieldName . '-value';
|
||||
}
|
||||
|
@ -103,25 +103,25 @@ for a field you simply override this default resolver.
|
||||
**graphql-php** provides following default field resolver:
|
||||
```php
|
||||
<?php
|
||||
function defaultFieldResolver($source, $args, $context, \GraphQL\Type\Definition\ResolveInfo $info)
|
||||
{
|
||||
$fieldName = $info->fieldName;
|
||||
$property = null;
|
||||
function defaultFieldResolver($objectValue, $args, $context, \GraphQL\Type\Definition\ResolveInfo $info)
|
||||
{
|
||||
$fieldName = $info->fieldName;
|
||||
$property = null;
|
||||
|
||||
if (is_array($source) || $source instanceof \ArrayAccess) {
|
||||
if (isset($source[$fieldName])) {
|
||||
$property = $source[$fieldName];
|
||||
}
|
||||
} else if (is_object($source)) {
|
||||
if (isset($source->{$fieldName})) {
|
||||
$property = $source->{$fieldName};
|
||||
if (is_array($objectValue) || $objectValue instanceof \ArrayAccess) {
|
||||
if (isset($objectValue[$fieldName])) {
|
||||
$property = $objectValue[$fieldName];
|
||||
}
|
||||
} elseif (is_object($objectValue)) {
|
||||
if (isset($objectValue->{$fieldName})) {
|
||||
$property = $objectValue->{$fieldName};
|
||||
}
|
||||
}
|
||||
|
||||
return $property instanceof Closure
|
||||
? $property($objectValue, $args, $context, $info)
|
||||
: $property;
|
||||
}
|
||||
|
||||
return $property instanceof Closure
|
||||
? $property($source, $args, $context, $info)
|
||||
: $property;
|
||||
}
|
||||
```
|
||||
|
||||
As you see it returns value by key (for arrays) or property (for objects).
|
||||
@ -163,7 +163,6 @@ $userType = new ObjectType([
|
||||
Keep in mind that **field resolver** has precedence over **default field resolver per type** which in turn
|
||||
has precedence over **default field resolver**.
|
||||
|
||||
|
||||
# Solving N+1 Problem
|
||||
Since: 0.9.0
|
||||
|
||||
|
@ -54,8 +54,8 @@ $queryType = new ObjectType([
|
||||
'args' => [
|
||||
'message' => Type::nonNull(Type::string()),
|
||||
],
|
||||
'resolve' => function ($root, $args) {
|
||||
return $root['prefix'] . $args['message'];
|
||||
'resolve' => function ($rootValue, $args) {
|
||||
return $rootValue['prefix'] . $args['message'];
|
||||
}
|
||||
],
|
||||
],
|
||||
|
@ -33,7 +33,7 @@ See [related documentation](executing-queries.md).
|
||||
* fieldResolver:
|
||||
* A resolver function to use when one is not provided by the schema.
|
||||
* If not provided, the default field resolver is used (which looks for a
|
||||
* value on the source value with the field's name).
|
||||
* value on the object value with the field's name).
|
||||
* validationRules:
|
||||
* A set of rules for query validation step. Default value is all available rules.
|
||||
* Empty array would allow to skip query validation (may be convenient for persisted
|
||||
|
@ -158,7 +158,7 @@ $heroType = new ObjectType([
|
||||
'args' => [
|
||||
'episode' => Type::nonNull($enumType)
|
||||
],
|
||||
'resolve' => function($_value, $args) {
|
||||
'resolve' => function($hero, $args) {
|
||||
return $args['episode'] === 5 ? true : false;
|
||||
}
|
||||
]
|
||||
|
@ -80,7 +80,7 @@ Option | Type | Notes
|
||||
name | `string` | **Required.** Name of the field. When not set - inferred from **fields** array key (read about [shorthand field definition](#shorthand-field-definitions) below)
|
||||
type | `Type` | **Required.** An instance of internal or custom type. Note: type must be represented by a single instance within one schema (see also [Type Registry](index.md#type-registry))
|
||||
args | `array` | An array of possible type arguments. Each entry is expected to be an array with keys: **name**, **type**, **description**, **defaultValue**. See [Field Arguments](#field-arguments) section below.
|
||||
resolve | `callable` | **function($value, $args, $context, [ResolveInfo](../reference.md#graphqltypedefinitionresolveinfo) $info)**<br> Given the **$value** of this type, it is expected to return actual value of the current field. See section on [Data Fetching](../data-fetching.md) for details
|
||||
resolve | `callable` | **function($objectValue, $args, $context, [ResolveInfo](../reference.md#graphqltypedefinitionresolveinfo) $info)**<br> Given the **$objectValue** of this type, it is expected to return actual value of the current field. See section on [Data Fetching](../data-fetching.md) for details
|
||||
complexity | `callable` | **function($childrenComplexity, $args)**<br> Used to restrict query complexity. The feature is disabled by default, read about [Security](../security.md#query-complexity-analysis) to use it.
|
||||
description | `string` | Plain-text description of this field for clients (e.g. used by [GraphiQL](https://github.com/graphql/graphiql) for auto-generated documentation)
|
||||
deprecationReason | `string` | Text describing why this field is deprecated. When not empty - field will not be returned by introspection queries (unless forced)
|
||||
|
@ -62,7 +62,7 @@ $mutationType = new ObjectType([
|
||||
'episode' => $episodeEnum,
|
||||
'review' => $reviewInputObject
|
||||
],
|
||||
'resolve' => function($val, $args) {
|
||||
'resolve' => function($rootValue, $args) {
|
||||
// TODOC
|
||||
}
|
||||
]
|
||||
|
@ -19,8 +19,8 @@ try {
|
||||
'args' => [
|
||||
'message' => ['type' => Type::string()],
|
||||
],
|
||||
'resolve' => function ($root, $args) {
|
||||
return $root['prefix'] . $args['message'];
|
||||
'resolve' => function ($rootValue, $args) {
|
||||
return $rootValue['prefix'] . $args['message'];
|
||||
}
|
||||
],
|
||||
],
|
||||
@ -35,7 +35,7 @@ try {
|
||||
'x' => ['type' => Type::int()],
|
||||
'y' => ['type' => Type::int()],
|
||||
],
|
||||
'resolve' => function ($root, $args) {
|
||||
'resolve' => function ($calc, $args) {
|
||||
return $args['x'] + $args['y'];
|
||||
},
|
||||
],
|
||||
|
@ -35,12 +35,12 @@ class CommentType extends ObjectType
|
||||
Types::htmlField('body')
|
||||
];
|
||||
},
|
||||
'resolveField' => function($value, $args, $context, ResolveInfo $info) {
|
||||
'resolveField' => function($comment, $args, $context, ResolveInfo $info) {
|
||||
$method = 'resolve' . ucfirst($info->fieldName);
|
||||
if (method_exists($this, $method)) {
|
||||
return $this->{$method}($value, $args, $context, $info);
|
||||
return $this->{$method}($comment, $args, $context, $info);
|
||||
} else {
|
||||
return $value->{$info->fieldName};
|
||||
return $comment->{$info->fieldName};
|
||||
}
|
||||
}
|
||||
];
|
||||
|
@ -57,8 +57,8 @@ class QueryType extends ObjectType
|
||||
],
|
||||
'hello' => Type::string()
|
||||
],
|
||||
'resolveField' => function($val, $args, $context, ResolveInfo $info) {
|
||||
return $this->{$info->fieldName}($val, $args, $context, $info);
|
||||
'resolveField' => function($rootValue, $args, $context, ResolveInfo $info) {
|
||||
return $this->{$info->fieldName}($rootValue, $args, $context, $info);
|
||||
}
|
||||
];
|
||||
parent::__construct($config);
|
||||
|
@ -75,12 +75,12 @@ class StoryType extends ObjectType
|
||||
'interfaces' => [
|
||||
Types::node()
|
||||
],
|
||||
'resolveField' => function($value, $args, $context, ResolveInfo $info) {
|
||||
'resolveField' => function($story, $args, $context, ResolveInfo $info) {
|
||||
$method = 'resolve' . ucfirst($info->fieldName);
|
||||
if (method_exists($this, $method)) {
|
||||
return $this->{$method}($value, $args, $context, $info);
|
||||
return $this->{$method}($story, $args, $context, $info);
|
||||
} else {
|
||||
return $value->{$info->fieldName};
|
||||
return $story->{$info->fieldName};
|
||||
}
|
||||
}
|
||||
];
|
||||
|
@ -44,12 +44,12 @@ class UserType extends ObjectType
|
||||
'interfaces' => [
|
||||
Types::node()
|
||||
],
|
||||
'resolveField' => function($value, $args, $context, ResolveInfo $info) {
|
||||
'resolveField' => function($user, $args, $context, ResolveInfo $info) {
|
||||
$method = 'resolve' . ucfirst($info->fieldName);
|
||||
if (method_exists($this, $method)) {
|
||||
return $this->{$method}($value, $args, $context, $info);
|
||||
return $this->{$method}($user, $args, $context, $info);
|
||||
} else {
|
||||
return $value->{$info->fieldName};
|
||||
return $user->{$info->fieldName};
|
||||
}
|
||||
}
|
||||
];
|
||||
|
@ -1,12 +1,12 @@
|
||||
<?php
|
||||
|
||||
interface Resolver {
|
||||
public function resolve($root, $args, $context);
|
||||
public function resolve($rootValue, $args, $context);
|
||||
}
|
||||
|
||||
class Addition implements Resolver
|
||||
{
|
||||
public function resolve($root, $args, $context)
|
||||
public function resolve($rootValue, $args, $context)
|
||||
{
|
||||
return $args['x'] + $args['y'];
|
||||
}
|
||||
@ -14,22 +14,22 @@ class Addition implements Resolver
|
||||
|
||||
class Echoer implements Resolver
|
||||
{
|
||||
public function resolve($root, $args, $context)
|
||||
public function resolve($rootValue, $args, $context)
|
||||
{
|
||||
return $root['prefix'].$args['message'];
|
||||
return $rootValue['prefix'].$args['message'];
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'sum' => function($root, $args, $context) {
|
||||
'sum' => function($rootValue, $args, $context) {
|
||||
$sum = new Addition();
|
||||
|
||||
return $sum->resolve($root, $args, $context);
|
||||
return $sum->resolve($rootValue, $args, $context);
|
||||
},
|
||||
'echo' => function($root, $args, $context) {
|
||||
'echo' => function($rootValue, $args, $context) {
|
||||
$echo = new Echoer();
|
||||
|
||||
return $echo->resolve($root, $args, $context);
|
||||
return $echo->resolve($rootValue, $args, $context);
|
||||
},
|
||||
'prefix' => 'You said: ',
|
||||
];
|
||||
|
@ -19,8 +19,8 @@ try {
|
||||
'args' => [
|
||||
'message' => ['type' => Type::string()],
|
||||
],
|
||||
'resolve' => function ($root, $args) {
|
||||
return $root['prefix'] . $args['message'];
|
||||
'resolve' => function ($rootValue, $args) {
|
||||
return $rootValue['prefix'] . $args['message'];
|
||||
}
|
||||
],
|
||||
],
|
||||
@ -35,7 +35,7 @@ try {
|
||||
'x' => ['type' => Type::int()],
|
||||
'y' => ['type' => Type::int()],
|
||||
],
|
||||
'resolve' => function ($root, $args) {
|
||||
'resolve' => function ($calc, $args) {
|
||||
return $args['x'] + $args['y'];
|
||||
},
|
||||
],
|
||||
|
@ -50,7 +50,7 @@ class ExecutionContext
|
||||
public function __construct(
|
||||
$schema,
|
||||
$fragments,
|
||||
$root,
|
||||
$rootValue,
|
||||
$contextValue,
|
||||
$operation,
|
||||
$variableValues,
|
||||
@ -60,7 +60,7 @@ class ExecutionContext
|
||||
) {
|
||||
$this->schema = $schema;
|
||||
$this->fragments = $fragments;
|
||||
$this->rootValue = $root;
|
||||
$this->rootValue = $rootValue;
|
||||
$this->contextValue = $contextValue;
|
||||
$this->operation = $operation;
|
||||
$this->variableValues = $variableValues;
|
||||
|
@ -157,33 +157,33 @@ class Executor
|
||||
|
||||
/**
|
||||
* If a resolve function is not given, then a default resolve behavior is used
|
||||
* which takes the property of the source object of the same name as the field
|
||||
* which takes the property of the root value of the same name as the field
|
||||
* and returns it as the result, or if it's a function, returns the result
|
||||
* of calling that function while passing along args and context.
|
||||
*
|
||||
* @param mixed $source
|
||||
* @param mixed $objectValue
|
||||
* @param mixed[] $args
|
||||
* @param mixed|null $context
|
||||
*
|
||||
* @return mixed|null
|
||||
*/
|
||||
public static function defaultFieldResolver($source, $args, $context, ResolveInfo $info)
|
||||
public static function defaultFieldResolver($objectValue, $args, $context, ResolveInfo $info)
|
||||
{
|
||||
$fieldName = $info->fieldName;
|
||||
$property = null;
|
||||
|
||||
if (is_array($source) || $source instanceof ArrayAccess) {
|
||||
if (isset($source[$fieldName])) {
|
||||
$property = $source[$fieldName];
|
||||
if (is_array($objectValue) || $objectValue instanceof ArrayAccess) {
|
||||
if (isset($objectValue[$fieldName])) {
|
||||
$property = $objectValue[$fieldName];
|
||||
}
|
||||
} elseif (is_object($source)) {
|
||||
if (isset($source->{$fieldName})) {
|
||||
$property = $source->{$fieldName};
|
||||
} elseif (is_object($objectValue)) {
|
||||
if (isset($objectValue->{$fieldName})) {
|
||||
$property = $objectValue->{$fieldName};
|
||||
}
|
||||
}
|
||||
|
||||
return $property instanceof Closure
|
||||
? $property($source, $args, $context, $info)
|
||||
? $property($objectValue, $args, $context, $info)
|
||||
: $property;
|
||||
}
|
||||
}
|
||||
|
@ -237,7 +237,7 @@ class ReferenceExecutor implements ExecutorImplementation
|
||||
/**
|
||||
* Implements the "Evaluating operations" section of the spec.
|
||||
*
|
||||
* @param mixed[] $rootValue
|
||||
* @param mixed $rootValue
|
||||
*
|
||||
* @return Promise|stdClass|mixed[]
|
||||
*/
|
||||
@ -463,21 +463,21 @@ class ReferenceExecutor implements ExecutorImplementation
|
||||
* Implements the "Evaluating selection sets" section of the spec
|
||||
* for "write" mode.
|
||||
*
|
||||
* @param mixed[] $sourceValue
|
||||
* @param mixed $rootValue
|
||||
* @param mixed[] $path
|
||||
* @param ArrayObject $fields
|
||||
*
|
||||
* @return Promise|stdClass|mixed[]
|
||||
*/
|
||||
private function executeFieldsSerially(ObjectType $parentType, $sourceValue, $path, $fields)
|
||||
private function executeFieldsSerially(ObjectType $parentType, $rootValue, $path, $fields)
|
||||
{
|
||||
$result = $this->promiseReduce(
|
||||
array_keys($fields->getArrayCopy()),
|
||||
function ($results, $responseName) use ($path, $parentType, $sourceValue, $fields) {
|
||||
function ($results, $responseName) use ($path, $parentType, $rootValue, $fields) {
|
||||
$fieldNodes = $fields[$responseName];
|
||||
$fieldPath = $path;
|
||||
$fieldPath[] = $responseName;
|
||||
$result = $this->resolveField($parentType, $sourceValue, $fieldNodes, $fieldPath);
|
||||
$result = $this->resolveField($parentType, $rootValue, $fieldNodes, $fieldPath);
|
||||
if ($result === self::$UNDEFINED) {
|
||||
return $results;
|
||||
}
|
||||
@ -505,18 +505,19 @@ class ReferenceExecutor implements ExecutorImplementation
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the field on the given source object. In particular, this
|
||||
* figures out the value that the field returns by calling its resolve function,
|
||||
* then calls completeValue to complete promises, serialize scalars, or execute
|
||||
* the sub-selection-set for objects.
|
||||
* Resolves the field on the given root value.
|
||||
*
|
||||
* @param object|null $source
|
||||
* In particular, this figures out the value that the field returns
|
||||
* by calling its resolve function, then calls completeValue to complete promises,
|
||||
* serialize scalars, or execute the sub-selection-set for objects.
|
||||
*
|
||||
* @param mixed $rootValue
|
||||
* @param FieldNode[] $fieldNodes
|
||||
* @param mixed[] $path
|
||||
*
|
||||
* @return mixed[]|Exception|mixed|null
|
||||
*/
|
||||
private function resolveField(ObjectType $parentType, $source, $fieldNodes, $path)
|
||||
private function resolveField(ObjectType $parentType, $rootValue, $fieldNodes, $path)
|
||||
{
|
||||
$exeContext = $this->exeContext;
|
||||
$fieldNode = $fieldNodes[0];
|
||||
@ -557,7 +558,7 @@ class ReferenceExecutor implements ExecutorImplementation
|
||||
$fieldDef,
|
||||
$fieldNode,
|
||||
$resolveFn,
|
||||
$source,
|
||||
$rootValue,
|
||||
$context,
|
||||
$info
|
||||
);
|
||||
@ -615,13 +616,13 @@ class ReferenceExecutor implements ExecutorImplementation
|
||||
* @param FieldDefinition $fieldDef
|
||||
* @param FieldNode $fieldNode
|
||||
* @param callable $resolveFn
|
||||
* @param mixed $source
|
||||
* @param mixed $rootValue
|
||||
* @param mixed $context
|
||||
* @param ResolveInfo $info
|
||||
*
|
||||
* @return Throwable|Promise|mixed
|
||||
*/
|
||||
private function resolveOrError($fieldDef, $fieldNode, $resolveFn, $source, $context, $info)
|
||||
private function resolveOrError($fieldDef, $fieldNode, $resolveFn, $rootValue, $context, $info)
|
||||
{
|
||||
try {
|
||||
// Build a map of arguments from the field.arguments AST, using the
|
||||
@ -632,7 +633,7 @@ class ReferenceExecutor implements ExecutorImplementation
|
||||
$this->exeContext->variableValues
|
||||
);
|
||||
|
||||
return $resolveFn($source, $args, $context, $info);
|
||||
return $resolveFn($rootValue, $args, $context, $info);
|
||||
} catch (Exception $error) {
|
||||
return $error;
|
||||
} catch (Throwable $error) {
|
||||
@ -1236,20 +1237,20 @@ class ReferenceExecutor implements ExecutorImplementation
|
||||
* Implements the "Evaluating selection sets" section of the spec
|
||||
* for "read" mode.
|
||||
*
|
||||
* @param mixed|null $source
|
||||
* @param mixed $rootValue
|
||||
* @param mixed[] $path
|
||||
* @param ArrayObject $fields
|
||||
*
|
||||
* @return Promise|stdClass|mixed[]
|
||||
*/
|
||||
private function executeFields(ObjectType $parentType, $source, $path, $fields)
|
||||
private function executeFields(ObjectType $parentType, $rootValue, $path, $fields)
|
||||
{
|
||||
$containsPromise = false;
|
||||
$finalResults = [];
|
||||
foreach ($fields as $responseName => $fieldNodes) {
|
||||
$fieldPath = $path;
|
||||
$fieldPath[] = $responseName;
|
||||
$result = $this->resolveField($parentType, $source, $fieldNodes, $fieldPath);
|
||||
$result = $this->resolveField($parentType, $rootValue, $fieldNodes, $fieldPath);
|
||||
if ($result === self::$UNDEFINED) {
|
||||
continue;
|
||||
}
|
||||
|
@ -391,13 +391,13 @@ class Helper
|
||||
*/
|
||||
private function resolveRootValue(ServerConfig $config, OperationParams $params, DocumentNode $doc, $operationType)
|
||||
{
|
||||
$root = $config->getRootValue();
|
||||
$rootValue = $config->getRootValue();
|
||||
|
||||
if (is_callable($root)) {
|
||||
$root = $root($params, $doc, $operationType);
|
||||
if (is_callable($rootValue)) {
|
||||
$rootValue = $rootValue($params, $doc, $operationType);
|
||||
}
|
||||
|
||||
return $root;
|
||||
return $rootValue;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -202,7 +202,7 @@ class ObjectType extends Type implements OutputType, CompositeType, NullableType
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed[] $value
|
||||
* @param mixed $value
|
||||
* @param mixed[]|null $context
|
||||
*
|
||||
* @return bool|null
|
||||
|
@ -109,10 +109,10 @@ class DeferredFieldsTest extends TestCase
|
||||
'fields' => [
|
||||
'title' => [
|
||||
'type' => Type::string(),
|
||||
'resolve' => function ($entry, $args, $context, ResolveInfo $info) {
|
||||
'resolve' => function ($story, $args, $context, ResolveInfo $info) {
|
||||
$this->paths[] = $info->path;
|
||||
|
||||
return $entry['title'];
|
||||
return $story['title'];
|
||||
},
|
||||
],
|
||||
'author' => [
|
||||
@ -185,7 +185,7 @@ class DeferredFieldsTest extends TestCase
|
||||
'fields' => [
|
||||
'topStories' => [
|
||||
'type' => Type::listOf($this->storyType),
|
||||
'resolve' => function ($val, $args, $context, ResolveInfo $info) {
|
||||
'resolve' => function ($rootValue, $args, $context, ResolveInfo $info) {
|
||||
$this->paths[] = $info->path;
|
||||
|
||||
return Utils::filter(
|
||||
@ -198,7 +198,7 @@ class DeferredFieldsTest extends TestCase
|
||||
],
|
||||
'featuredCategory' => [
|
||||
'type' => $this->categoryType,
|
||||
'resolve' => function ($val, $args, $context, ResolveInfo $info) {
|
||||
'resolve' => function ($rootValue, $args, $context, ResolveInfo $info) {
|
||||
$this->paths[] = $info->path;
|
||||
|
||||
return $this->categoryDataSource[0];
|
||||
@ -206,7 +206,7 @@ class DeferredFieldsTest extends TestCase
|
||||
],
|
||||
'categories' => [
|
||||
'type' => Type::listOf($this->categoryType),
|
||||
'resolve' => function ($val, $args, $context, ResolveInfo $info) {
|
||||
'resolve' => function ($rootValue, $args, $context, ResolveInfo $info) {
|
||||
$this->paths[] = $info->path;
|
||||
|
||||
return $this->categoryDataSource;
|
||||
@ -401,7 +401,7 @@ class DeferredFieldsTest extends TestCase
|
||||
return [
|
||||
'sync' => [
|
||||
'type' => Type::string(),
|
||||
'resolve' => function ($val, $args, $context, ResolveInfo $info) {
|
||||
'resolve' => function ($complexType, $args, $context, ResolveInfo $info) {
|
||||
$this->paths[] = $info->path;
|
||||
|
||||
return 'sync';
|
||||
@ -409,7 +409,7 @@ class DeferredFieldsTest extends TestCase
|
||||
],
|
||||
'deferred' => [
|
||||
'type' => Type::string(),
|
||||
'resolve' => function ($val, $args, $context, ResolveInfo $info) {
|
||||
'resolve' => function ($complexType, $args, $context, ResolveInfo $info) {
|
||||
$this->paths[] = $info->path;
|
||||
|
||||
return new Deferred(function () use ($info) {
|
||||
@ -421,7 +421,7 @@ class DeferredFieldsTest extends TestCase
|
||||
],
|
||||
'nest' => [
|
||||
'type' => $complexType,
|
||||
'resolve' => function ($val, $args, $context, ResolveInfo $info) {
|
||||
'resolve' => function ($complexType, $args, $context, ResolveInfo $info) {
|
||||
$this->paths[] = $info->path;
|
||||
|
||||
return [];
|
||||
@ -429,7 +429,7 @@ class DeferredFieldsTest extends TestCase
|
||||
],
|
||||
'deferredNest' => [
|
||||
'type' => $complexType,
|
||||
'resolve' => function ($val, $args, $context, ResolveInfo $info) {
|
||||
'resolve' => function ($complexType, $args, $context, ResolveInfo $info) {
|
||||
$this->paths[] = $info->path;
|
||||
|
||||
return new Deferred(function () use ($info) {
|
||||
|
@ -75,7 +75,7 @@ class ExecutorSchemaTest extends TestCase
|
||||
'article' => [
|
||||
'type' => $BlogArticle,
|
||||
'args' => ['id' => ['type' => Type::id()]],
|
||||
'resolve' => function ($_, $args) {
|
||||
'resolve' => function ($rootValue, $args) {
|
||||
return $this->article($args['id']);
|
||||
},
|
||||
],
|
||||
|
@ -273,7 +273,7 @@ class ExecutorTest extends TestCase
|
||||
'fields' => [
|
||||
'test' => [
|
||||
'type' => Type::string(),
|
||||
'resolve' => static function ($val, $args, $ctx, $_info) use (&$info) {
|
||||
'resolve' => static function ($test, $args, $ctx, $_info) use (&$info) {
|
||||
$info = $_info;
|
||||
},
|
||||
],
|
||||
|
@ -16,7 +16,7 @@ class Adder
|
||||
{
|
||||
$this->num = $num;
|
||||
|
||||
$this->test = function ($source, $args, $context) {
|
||||
$this->test = function ($objectValue, $args, $context) {
|
||||
return $this->num + $args['addend1'] + $context['addend2'];
|
||||
};
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ class GraphQLTest extends TestCase
|
||||
'type' => Type::nonNull(Type::string()),
|
||||
],
|
||||
],
|
||||
'resolve' => static function ($value, $args) use ($promiseAdapter) {
|
||||
'resolve' => static function ($rootValue, $args) use ($promiseAdapter) {
|
||||
return $promiseAdapter->createFulfilled(sprintf('Hi %s!', $args['name']));
|
||||
},
|
||||
],
|
||||
|
@ -30,7 +30,7 @@ class Issue396Test extends TestCase
|
||||
$unionResult = new UnionType([
|
||||
'name' => 'UnionResult',
|
||||
'types' => [$a, $b, $c],
|
||||
'resolveType' => static function ($result, $root, ResolveInfo $info) use ($a, $b, $c, &$log) : Type {
|
||||
'resolveType' => static function ($result, $value, ResolveInfo $info) use ($a, $b, $c, &$log) : Type {
|
||||
$log[] = [$result, $info->path];
|
||||
if (stristr($result['name'], 'A')) {
|
||||
return $a;
|
||||
@ -97,7 +97,7 @@ class Issue396Test extends TestCase
|
||||
'fields' => [
|
||||
'name' => Type::string(),
|
||||
],
|
||||
'resolveType' => static function ($result, $root, ResolveInfo $info) use (&$a, &$b, &$c, &$log) : Type {
|
||||
'resolveType' => static function ($result, $value, ResolveInfo $info) use (&$a, &$b, &$c, &$log) : Type {
|
||||
$log[] = [$result, $info->path];
|
||||
if (stristr($result['name'], 'A')) {
|
||||
return $a;
|
||||
|
@ -25,13 +25,13 @@ abstract class ServerTestCase extends TestCase
|
||||
'fields' => [
|
||||
'f1' => [
|
||||
'type' => Type::string(),
|
||||
'resolve' => static function ($root, $args, $context, $info) {
|
||||
'resolve' => static function ($rootValue, $args, $context, $info) {
|
||||
return $info->fieldName;
|
||||
},
|
||||
],
|
||||
'fieldWithPhpError' => [
|
||||
'type' => Type::string(),
|
||||
'resolve' => static function ($root, $args, $context, $info) {
|
||||
'resolve' => static function ($rootValue, $args, $context, $info) {
|
||||
trigger_error('deprecated', E_USER_DEPRECATED);
|
||||
trigger_error('notice', E_USER_NOTICE);
|
||||
trigger_error('warning', E_USER_WARNING);
|
||||
@ -55,8 +55,8 @@ abstract class ServerTestCase extends TestCase
|
||||
],
|
||||
'testContextAndRootValue' => [
|
||||
'type' => Type::string(),
|
||||
'resolve' => static function ($root, $args, $context, $info) {
|
||||
$context->testedRootValue = $root;
|
||||
'resolve' => static function ($rootValue, $args, $context, $info) {
|
||||
$context->testedRootValue = $rootValue;
|
||||
|
||||
return $info->fieldName;
|
||||
},
|
||||
@ -68,7 +68,7 @@ abstract class ServerTestCase extends TestCase
|
||||
'type' => Type::nonNull(Type::string()),
|
||||
],
|
||||
],
|
||||
'resolve' => static function ($root, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
return $args['arg'];
|
||||
},
|
||||
],
|
||||
@ -79,7 +79,7 @@ abstract class ServerTestCase extends TestCase
|
||||
'type' => Type::nonNull(Type::int()),
|
||||
],
|
||||
],
|
||||
'resolve' => static function ($root, $args, $context) {
|
||||
'resolve' => static function ($rootValue, $args, $context) {
|
||||
$context['buffer']($args['num']);
|
||||
|
||||
return new Deferred(static function () use ($args, $context) {
|
||||
|
@ -273,7 +273,7 @@ class StarWarsSchema
|
||||
'type' => $episodeEnum,
|
||||
],
|
||||
],
|
||||
'resolve' => static function ($root, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
return StarWarsData::getHero($args['episode'] ?? null);
|
||||
},
|
||||
],
|
||||
@ -286,7 +286,7 @@ class StarWarsSchema
|
||||
'type' => Type::nonNull(Type::string()),
|
||||
],
|
||||
],
|
||||
'resolve' => static function ($root, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
$humans = StarWarsData::humans();
|
||||
|
||||
return $humans[$args['id']] ?? null;
|
||||
@ -301,7 +301,7 @@ class StarWarsSchema
|
||||
'type' => Type::nonNull(Type::string()),
|
||||
],
|
||||
],
|
||||
'resolve' => static function ($root, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
$droids = StarWarsData::droids();
|
||||
|
||||
return $droids[$args['id']] ?? null;
|
||||
|
@ -74,7 +74,7 @@ class EnumTypeTest extends TestCase
|
||||
'fromInt' => ['type' => Type::int()],
|
||||
'fromString' => ['type' => Type::string()],
|
||||
],
|
||||
'resolve' => static function ($value, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
if (isset($args['fromInt'])) {
|
||||
return $args['fromInt'];
|
||||
}
|
||||
@ -92,7 +92,7 @@ class EnumTypeTest extends TestCase
|
||||
'fromName' => ['type' => Type::string()],
|
||||
'fromValue' => ['type' => Type::string()],
|
||||
],
|
||||
'resolve' => static function ($value, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
if (isset($args['fromName'])) {
|
||||
return $args['fromName'];
|
||||
}
|
||||
@ -107,7 +107,7 @@ class EnumTypeTest extends TestCase
|
||||
'fromEnum' => ['type' => $ColorType],
|
||||
'fromInt' => ['type' => Type::int()],
|
||||
],
|
||||
'resolve' => static function ($value, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
if (isset($args['fromInt'])) {
|
||||
return $args['fromInt'];
|
||||
}
|
||||
@ -132,7 +132,7 @@ class EnumTypeTest extends TestCase
|
||||
'type' => Type::boolean(),
|
||||
],
|
||||
],
|
||||
'resolve' => static function ($value, $args) use ($Complex2) {
|
||||
'resolve' => static function ($rootValue, $args) use ($Complex2) {
|
||||
if (! empty($args['provideGoodValue'])) {
|
||||
// Note: this is one of the references of the internal values which
|
||||
// ComplexEnum allows.
|
||||
@ -156,7 +156,7 @@ class EnumTypeTest extends TestCase
|
||||
'favoriteEnum' => [
|
||||
'type' => $ColorType,
|
||||
'args' => ['color' => ['type' => $ColorType]],
|
||||
'resolve' => static function ($value, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
return $args['color'] ?? null;
|
||||
},
|
||||
],
|
||||
@ -169,7 +169,7 @@ class EnumTypeTest extends TestCase
|
||||
'subscribeToEnum' => [
|
||||
'type' => $ColorType,
|
||||
'args' => ['color' => ['type' => $ColorType]],
|
||||
'resolve' => static function ($value, $args) {
|
||||
'resolve' => static function ($rootValue, $args) {
|
||||
return $args['color'] ?? null;
|
||||
},
|
||||
],
|
||||
|
@ -1049,7 +1049,7 @@ class IntrospectionTest extends TestCase
|
||||
'field' => [
|
||||
'type' => Type::string(),
|
||||
'args' => ['complex' => ['type' => $TestInputObject]],
|
||||
'resolve' => static function ($_, $args) {
|
||||
'resolve' => static function ($testType, $args) {
|
||||
return json_encode($args['complex']);
|
||||
},
|
||||
],
|
||||
|
@ -393,7 +393,7 @@ final class QueryPlanTest extends TestCase
|
||||
}
|
||||
},
|
||||
]);
|
||||
$result = GraphQL::executeQuery($schema, $query)->toArray();
|
||||
GraphQL::executeQuery($schema, $query)->toArray();
|
||||
|
||||
self::assertTrue($hasCalled);
|
||||
self::assertEquals($expectedQueryPlan, $queryPlan->queryPlan());
|
||||
|
@ -51,7 +51,7 @@ class BuildSchemaTest extends TestCase
|
||||
');
|
||||
|
||||
$root = [
|
||||
'add' => static function ($root, $args) {
|
||||
'add' => static function ($rootValue, $args) {
|
||||
return $args['x'] + $args['y'];
|
||||
},
|
||||
];
|
||||
@ -437,7 +437,7 @@ type WorldTwo {
|
||||
*/
|
||||
public function testSpecifyingUnionTypeUsingTypename() : void
|
||||
{
|
||||
$schema = BuildSchema::buildAST(Parser::parse('
|
||||
$schema = BuildSchema::buildAST(Parser::parse('
|
||||
type Query {
|
||||
fruits: [Fruit]
|
||||
}
|
||||
@ -452,7 +452,7 @@ type WorldTwo {
|
||||
length: Int
|
||||
}
|
||||
'));
|
||||
$query = '
|
||||
$query = '
|
||||
{
|
||||
fruits {
|
||||
... on Apple {
|
||||
@ -464,7 +464,7 @@ type WorldTwo {
|
||||
}
|
||||
}
|
||||
';
|
||||
$root = [
|
||||
$rootValue = [
|
||||
'fruits' => [
|
||||
[
|
||||
'color' => 'green',
|
||||
@ -476,7 +476,7 @@ type WorldTwo {
|
||||
],
|
||||
],
|
||||
];
|
||||
$expected = [
|
||||
$expected = [
|
||||
'data' => [
|
||||
'fruits' => [
|
||||
['color' => 'green'],
|
||||
@ -485,7 +485,7 @@ type WorldTwo {
|
||||
],
|
||||
];
|
||||
|
||||
$result = GraphQL::executeQuery($schema, $query, $root);
|
||||
$result = GraphQL::executeQuery($schema, $query, $rootValue);
|
||||
self::assertEquals($expected, $result->toArray(true));
|
||||
}
|
||||
|
||||
@ -494,7 +494,7 @@ type WorldTwo {
|
||||
*/
|
||||
public function testSpecifyingInterfaceUsingTypename() : void
|
||||
{
|
||||
$schema = BuildSchema::buildAST(Parser::parse('
|
||||
$schema = BuildSchema::buildAST(Parser::parse('
|
||||
type Query {
|
||||
characters: [Character]
|
||||
}
|
||||
@ -513,7 +513,7 @@ type WorldTwo {
|
||||
primaryFunction: String
|
||||
}
|
||||
'));
|
||||
$query = '
|
||||
$query = '
|
||||
{
|
||||
characters {
|
||||
name
|
||||
@ -526,7 +526,7 @@ type WorldTwo {
|
||||
}
|
||||
}
|
||||
';
|
||||
$root = [
|
||||
$rootValue = [
|
||||
'characters' => [
|
||||
[
|
||||
'name' => 'Han Solo',
|
||||
@ -540,7 +540,7 @@ type WorldTwo {
|
||||
],
|
||||
],
|
||||
];
|
||||
$expected = [
|
||||
$expected = [
|
||||
'data' => [
|
||||
'characters' => [
|
||||
['name' => 'Han Solo', 'totalCredits' => 10],
|
||||
@ -549,7 +549,7 @@ type WorldTwo {
|
||||
],
|
||||
];
|
||||
|
||||
$result = GraphQL::executeQuery($schema, $query, $root);
|
||||
$result = GraphQL::executeQuery($schema, $query, $rootValue);
|
||||
self::assertEquals($expected, $result->toArray(true));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user