Drupal 8.x + Модуль GraphQL Пользовательский тип / Плагин получения полей Ошибка «поля должны быть объектом с именами полей в качестве ключей» - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь создать модуль, который определяет свой собственный пользовательский тип и подключаемые модули Field.

При установке GraphQLi сообщает в консоли следующую ошибку:

Uncaught Error: поля CustomTypeInterfaceдолжен быть объектом с именами полей в качестве ключей или функцией, которая возвращает такой объект.

Drupal 8.61.Я пробовал на GraphQL 3.0-RC2 и 3.x-Dev.Любая помощь приветствуется.Спасибо.

Мой код выглядит следующим образом:

/ graphql_custom.info.yml

name: GraphQL Custom Type Example
type: module
description: ''
package: GraphQL
core: 8.x
dependencies:
  - graphql_core

/ src / CustomObject.php

namespace Drupal\graphql_custom;

class CustomObject {
    protected $data;

    function __construct(String $data) {
        $this->data = $data;
    }

    function getData() {
        return $this->data;
    }
}

/src/Plugin/GraphQL/Fields/CustomField.php

<?php

namespace Drupal\graphql_custom\Plugin\GraphQL\Fields;

use Drupal\graphql_custom\CustomObject;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\graphql\GraphQL\Execution\ResolveContext;
use Drupal\graphql\Plugin\GraphQL\Fields\FieldPluginBase;
use GraphQL\Type\Definition\ResolveInfo;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Created Custom Object with argument as data.
 *
 * @GraphQLField(
 *   id = "custom_field",
 *   secure = true,
 *   name = "customfield",
 *   type = "CustomType",
 *   nullable = true,
 *   arguments = {
 *     "argument" = "String!"
 *   }
 * )
 */
class CustomField extends FieldPluginBase implements ContainerFactoryPluginInterface {
    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
        return new static(
            $configuration,
            $plugin_id,
            $plugin_definition
        );
    }

    /**
     * {@inheritdoc}
     */
    protected function isLanguageAwareField() {
        return FALSE;
    }

    /**
     * {@inheritdoc}
     */
    public function resolve($value, array $args, ResolveContext $context, ResolveInfo $info) {
        return parent::resolve($value, $args, $context, $info);
    }

    /**
     * {@inheritdoc}
     */
    public function resolveValues($value, array $args, ResolveContext $context, ResolveInfo $info) {
        $arg = $args['argument'];
        $object = new CustomObject($arg);

        yield $object;
    }
}

/ src / Plugin / GraphQL / Fields / CustomFieldData.php

<?php

namespace Drupal\graphql_custom\Plugin\GraphQL\Fields;

use Drupal\graphql_custom\CustomObject;
use Drupal\graphql\Plugin\GraphQL\Fields\FieldPluginBase;
use Drupal\graphql\GraphQL\Execution\ResolveContext;
use GraphQL\Type\Definition\ResolveInfo;

/**
 * Custom Type Data Field
 *
 * @GraphQLField(
 *   id = "custom_field_data",
 *   secure = true,
 *   name = "data",
 *   type = "String",
 *   parents = {"CustomType"}
 * )
 */

class CustomFieldData extends FieldPluginBase {
    /**
     * {@inheritdoc}
     */
    protected function resolveValues($value, array $args, $context, $info) {
        if ($value instanceOf CustomObject) {
            yield (string) $value->getData();
        } else {
            yield (string) "Empty";
        }
    }
}

/ src / Plugin / GraphQL / Интерфейсы/CustomTypeInterface.php

<?php

namespace Drupal\graphql_custom\Plugin\GraphQL\Interfaces;

use Drupal\graphql_custom\CustomObject;
use Drupal\graphql\Annotation\GraphQLInterface;
use Drupal\graphql\Plugin\GraphQL\Interfaces\InterfacePluginBase;

/**
 * Interface for Custom Type.
 *
 * For simplicity reasons, this example does not utilize dependency injection.
 *
 * @GraphQLInterface(
 *   id = "custom_type_interface",
 *   name = "CustomTypeInterface"
 * )
 */

class CustomTypeInterface extends InterfacePluginBase {
    /**
     * {@inheritdoc}
     */
    public function resolveType($object) {
        if ($object instanceof CustomObject) {
            $schemaManager = \Drupal::service('graphql_core.schema_manager');

            return $schemaManager->findByName('CustomType', [
                    GRAPHQL_CORE_TYPE_PLUGIN,
                ]);
        }
    }
}

/ src / Plugin / GraphQL / Types / CustomType.php

<?php
namespace Drupal\graphql_custom\Plugin\GraphQL\Types;

use Drupal\graphql_custom\CustomObject;
use Drupal\graphql\Plugin\GraphQL\Types\TypePluginBase;
use Drupal\graphql\GraphQL\Execution\ResolveContext;
use GraphQL\Type\Definition\ResolveInfo;

/**
 * GraphQL Custom Type.
 *
 * @GraphQLType(
 *   id = "custom_type",
 *   name = "CustomType",
 *   interfaces = {"CustomTypeInterface"}
 * )
 */

class CustomType extends TypePluginBase {
    /**
     * {@inheritdoc}
     */
    public function applies($object, ResolveContext $context, ResolveInfo $info) {
        return $object instanceof CustomObject;
    }
}

1 Ответ

0 голосов
/ 22 ноября 2018

В ваших полях вы должны использовать ссылку на интерфейс в родителях вместо типа:

parents = {"CustomTypeInterface"}

Другой способ - удалить интерфейс и использовать прямую ссылку на тип, как указано в вашем примере.

...