mirror of
https://github.com/retailcrm/graphql-php.git
synced 2024-11-25 14:26:08 +03:00
Ability to receive list of requested fields from ResolveInfo (recursively)
This commit is contained in:
parent
74b922ce68
commit
aeb56d139a
@ -3,7 +3,10 @@ namespace GraphQL\Type\Definition;
|
|||||||
|
|
||||||
use GraphQL\Language\AST\Field;
|
use GraphQL\Language\AST\Field;
|
||||||
use GraphQL\Language\AST\FragmentDefinition;
|
use GraphQL\Language\AST\FragmentDefinition;
|
||||||
|
use GraphQL\Language\AST\FragmentSpread;
|
||||||
use GraphQL\Language\AST\OperationDefinition;
|
use GraphQL\Language\AST\OperationDefinition;
|
||||||
|
use GraphQL\Language\AST\Selection;
|
||||||
|
use GraphQL\Language\AST\SelectionSet;
|
||||||
use GraphQL\Schema;
|
use GraphQL\Schema;
|
||||||
use GraphQL\Utils;
|
use GraphQL\Utils;
|
||||||
|
|
||||||
@ -58,4 +61,64 @@ class ResolveInfo
|
|||||||
{
|
{
|
||||||
Utils::assign($this, $values);
|
Utils::assign($this, $values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method that returns names of all fields selected in query for $this->fieldName up to $depth levels
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* query AppHomeRoute{viewer{id,..._0c28183ce}} fragment _0c28183ce on Viewer{id,profile{firstName,id,locations{id}}}
|
||||||
|
* Example:
|
||||||
|
* query MyQuery{
|
||||||
|
* {
|
||||||
|
* root {
|
||||||
|
* id,
|
||||||
|
* nested {
|
||||||
|
* nested1
|
||||||
|
* nested2 {
|
||||||
|
* nested3
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Given this ResolveInfo instance is a part of "root" field resolution, and $depth === 1, method will return:
|
||||||
|
* [
|
||||||
|
* 'id' => true,
|
||||||
|
* 'nested' => [
|
||||||
|
* nested1 => true,
|
||||||
|
* nested2 => true
|
||||||
|
* ]
|
||||||
|
* ]
|
||||||
|
*
|
||||||
|
* @param int $depth How many levels to include in output
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getFieldSelection($depth = 0)
|
||||||
|
{
|
||||||
|
/** @var Field $fieldAST */
|
||||||
|
$fieldAST = $this->fieldASTs[0];
|
||||||
|
return $this->foldSelectionSet($fieldAST->selectionSet, $depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function foldSelectionSet(SelectionSet $selectionSet, $descend)
|
||||||
|
{
|
||||||
|
$fields = [];
|
||||||
|
|
||||||
|
foreach ($selectionSet->selections as $selectionAST) {
|
||||||
|
if ($selectionAST instanceof Field) {
|
||||||
|
$fields[$selectionAST->name->value] = $descend > 0 && !empty($selectionAST->selectionSet)
|
||||||
|
? $this->foldSelectionSet($selectionAST->selectionSet, --$descend)
|
||||||
|
: true;
|
||||||
|
} else if ($selectionAST instanceof FragmentSpread) {
|
||||||
|
$spreadName = $selectionAST->name->value;
|
||||||
|
if (isset($this->fragments[$spreadName])) {
|
||||||
|
/** @var FragmentDefinition $fragment */
|
||||||
|
$fragment = $this->fragments[$spreadName];
|
||||||
|
$fields += $this->foldSelectionSet($fragment->selectionSet, $descend);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $fields;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user