Как разрешить тип объединения, указанный в языке типов? - PullRequest
0 голосов
/ 04 июня 2019

Я использую graphql-php, определяя мою схему в стиле языка типа, как определено здесь , и использую пользовательский распознаватель по умолчанию просто для выполнения метода, если он существует, добавляя эту небольшую часть :

elseif (method_exists($source, $fieldName)) {
  $property = $source->{$fieldName}();
}

Таким образом, я определил каждую модель, реализующую методы, названные полями GraphQL.

В документах указано, как определить тип объединения с помощью встроенного стиля , но я указал мою схему с помощью языка типов. Возьми следующую выдержку из моей схемы:

type ServiceProvider {
    entity: ServiceProviderEntity
    data: [ServiceProviderDetails]
}

union ServiceProviderEntity = Provider | Service

Я определил тип ServiceProvider со следующим классом:

class ServiceProvider
{
    /**
     * A list of service provider details.
     *
     * @var ServiceProviderDetails[]
     */
    private $data = [];

    /**
     * @var ServiceProviderEntity
     */
    private $entity;


    /**
     * It sets a list of information related to this service-provider relationship.
     *
     * @param ServiceProviderDetails[] $data The list of data to be set.
     *
     * @return ServiceProvider
     */
    public function setData(array $data): ServiceProvider
    {
        $this->data = $data;
        return $this;
    }

    public function entity()
    {
        $this->logger->debug("Calling entity", [$this->entity->isTypeOf()]);
        return $this->entity->entity();
    }

    public function setEntity(ServiceProviderEntity $entity)
    {
        $this->entity = $entity;
        return $this;
    }

    /**
     * It returns the list of details.
     *
     * @return ServiceProviderDetails[]
     */
    public function data()
    {
        return $this->data;
    }

    /**
     * It adds a service/provider as details related to the entity.
     *
     * @param ServiceProviderDetails $item An instance of ServiceProviderDetails.
     *
     * @return ServiceProvider
     */
    public function addDataItem(ServiceProviderDetails $item)
    {
        array_push($this->data, $item);
        return $this;
    }
}

И основной метод ServiceProviderEntity следующий:

    public function setEntity($entity)
    {
        if (!empty($entity)) {
            $this->typename = (new ReflectionClass($entity))->getShortName();

            switch ($this->typename) {
                case "Service":
                    $this->entity = (new Service())->setCoreService($entity);
                    break;
                case "Provider":
                    $this->entity = (new Provider())->setCoreProvider($entity);
                    break;
                default:
                    throw new ServicesException("Cannot find {$this->typename}");
            }
        }

        return $this;
    }

Когда я выполняю запрос для извлечения услуг одним провайдером, я создаю ServiceProviderEntity, передавая экземпляр Provider или Service с методом ServiceProviderEntity#setEntity.

Однако я продолжаю получать сообщение об ошибке:

{
  "errors": [
    {
      "debugMessage": "Abstract type ServiceProviderEntity must resolve to an Object type at runtime for field ServiceProvider.entity with value \"instance of SosTariffe\\Components\\SosServices\\Schema\\Model\\Provider\", received \"null\". Either the ServiceProviderEntity type should provide a \"resolveType\" function or each possible type should provide an \"isTypeOf\" function.",
      "message": "Internal server error",
      "extensions": {
        "category": "internal"
      },
      "locations": [
        {
          "line": 4,
          "column": 7
        }
      ],
      "path": [
        "getServicesByProviderId",
        "entity"
      ],
      "trace": [
        {
          "file": "/home/ccastelli/Documents/sos-services/vendor/webonyx/graphql-php/src/Executor/ReferenceExecutor.php",
          "line": 1038,
          "call": "GraphQL\\Executor\\ReferenceExecutor::ensureValidRuntimeType(null, GraphQLType: ServiceProviderEntity, instance of GraphQL\\Type\\Definition\\ResolveInfo, instance of SosTariffe\\Components\\SosServices\\Schema\\Model\\Provider)"
        },
  ...

Так что я действительно не знаю, как мне определить тип объединения таким образом. Я не могу понять, как / где я должен определить resolveType или isTypeOf и что я должен вернуть.

...