2017-02-22 28 views
0

Я использую версию v1.4.2.18. Библиотеку можно найти здесь: https://github.com/Youshido/GraphQLPHP Youshido Проблема GraphQL с вложенными полями

Я пытаюсь выполнить следующие действия:

query { 
    articleSummary(id:1) { 
     title, 
     body, 
     article { 
      id 
     } 
    } 
} 

У меня есть ArticleSummaryField.php:

class ArticleSummaryField extends AbstractField 
{ 
    public function build(FieldConfig $config) 
    { 
     $config->addArgument('id', new NonNullType(new StringType())); 
    } 

    public function getType() 
    { 

     return new ArticleSummaryType(); 
    } 

    public function resolve($value, array $args, ResolveInfo $info) 
    { 
     return [ 
      'title' => 'test title', 
      'body' => 'test body', 
      'article' => $args['id'] 
     ]; 
    } 
} 

Тогда ArticleSummaryType.php:

class ArticleSummaryType extends AbstractObjectType 
{ 
    public function build($config) 
    { 
     $config 
      ->addField('title', new StringType()); 
      ->addField('body', new StringType()); 
      ->addField('article', new ArticleField()); 
    } 
} 

Затем метод ArticleField.php имеет метод getType, который возвращает тип ArticleType whi ch имеет поле id.

Однако то, что я получаю ошибку:

Fatal error: Uncaught Error: Call to undefined method ArticleField::getNullableType() in .../vendor/youshido/graphql/src/Execution/Processor.php on line 135 

То, что кажется, происходит то, что, когда $targetField->getType() на линии 135 в ИПВ/Execution/Processor.php называется его возвращение ArticleField класс, а не ArticleType класс.

Я бы ожидал, что вернет класс, объявленный в методе getType в классе ArticleField.

Я собираюсь сделать это неправильно для гнездования полей? Или есть ошибка в библиотеке?

ответ

0

Для этого вы передаете только класс Field в качестве первого аргумента.

class ArticleSummaryType extends AbstractObjectType 
{ 
    public function build($config) 
    { 
     $config 
      ->addField('title', new StringType()); 
      ->addField('body', new StringType()); 
      ->addField(new ArticleField()); 
    } 
} 

Тогда в классе поля можно переопределить getName задать имя для поля по мере необходимости или она будет использовать имя класса в качестве имени поля.