mirror of
https://github.com/retailcrm/graphql-php.git
synced 2025-02-16 12:23:15 +03:00
Ability to set type-level "resolveField" method
This commit is contained in:
parent
5241c8a5d3
commit
003fa005ed
@ -47,7 +47,7 @@ class Executor
|
|||||||
{
|
{
|
||||||
private static $UNDEFINED;
|
private static $UNDEFINED;
|
||||||
|
|
||||||
private static $defaultResolveFn;
|
private static $defaultResolveFn = [__CLASS__, 'defaultResolveFn'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom default resolve function
|
* Custom default resolve function
|
||||||
@ -365,10 +365,10 @@ class Executor
|
|||||||
|
|
||||||
if (isset($fieldDef->resolve)) {
|
if (isset($fieldDef->resolve)) {
|
||||||
$resolveFn = $fieldDef->resolve;
|
$resolveFn = $fieldDef->resolve;
|
||||||
} else if (isset(self::$defaultResolveFn)) {
|
} else if (isset($parentType->resolveField)) {
|
||||||
$resolveFn = self::$defaultResolveFn;
|
$resolveFn = $parentType->resolveField;
|
||||||
} else {
|
} else {
|
||||||
$resolveFn = [__CLASS__, 'defaultResolveFn'];
|
$resolveFn = self::$defaultResolveFn;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build hash of arguments from the field.arguments AST, using the
|
// Build hash of arguments from the field.arguments AST, using the
|
||||||
@ -577,12 +577,12 @@ class Executor
|
|||||||
$property = $source[$fieldName];
|
$property = $source[$fieldName];
|
||||||
}
|
}
|
||||||
} else if (is_object($source)) {
|
} else if (is_object($source)) {
|
||||||
if (property_exists($source, $fieldName)) {
|
if (isset($source->{$fieldName})) {
|
||||||
$property = $source->{$fieldName};
|
$property = $source->{$fieldName};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return is_callable($property) ? call_user_func($property, $source) : $property;
|
return $property instanceof \Closure ? $property($source) : $property;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,12 +66,18 @@ class ObjectType extends Type implements OutputType, CompositeType
|
|||||||
|
|
||||||
private $_initialized = false;
|
private $_initialized = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var callable
|
||||||
|
*/
|
||||||
|
public $resolveField;
|
||||||
|
|
||||||
public function __construct(array $config)
|
public function __construct(array $config)
|
||||||
{
|
{
|
||||||
Utils::invariant(!empty($config['name']), 'Every type is expected to have name');
|
Utils::invariant(!empty($config['name']), 'Every type is expected to have name');
|
||||||
|
|
||||||
$this->name = $config['name'];
|
$this->name = $config['name'];
|
||||||
$this->description = isset($config['description']) ? $config['description'] : null;
|
$this->description = isset($config['description']) ? $config['description'] : null;
|
||||||
|
$this->resolveField = isset($config['resolveField']) ? $config['resolveField'] : null;
|
||||||
$this->_config = $config;
|
$this->_config = $config;
|
||||||
|
|
||||||
if (isset($config['interfaces'])) {
|
if (isset($config['interfaces'])) {
|
||||||
@ -109,6 +115,7 @@ class ObjectType extends Type implements OutputType, CompositeType
|
|||||||
Config::INTERFACE_TYPE
|
Config::INTERFACE_TYPE
|
||||||
),
|
),
|
||||||
'isTypeOf' => Config::CALLBACK, // ($value, ResolveInfo $info) => boolean
|
'isTypeOf' => Config::CALLBACK, // ($value, ResolveInfo $info) => boolean
|
||||||
|
'resolveField' => Config::CALLBACK
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->_fields = FieldDefinition::createMap($config['fields']);
|
$this->_fields = FieldDefinition::createMap($config['fields']);
|
||||||
@ -118,7 +125,7 @@ class ObjectType extends Type implements OutputType, CompositeType
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array<FieldDefinition>
|
* @return FieldDefinition[]
|
||||||
*/
|
*/
|
||||||
public function getFields()
|
public function getFields()
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user