代码之家  ›  专栏  ›  技术社区  ›  Chris

如何解析通过类型语言指定的联合类型?

  •  0
  • Chris  · 技术社区  · 6 年前

    我在用 graphql-php 在中定义我的架构 type language style as defined here 使用 a custom default resolver 只是执行一个方法,如果存在,添加这个小部分:

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

    通过这种方式,我定义了实现名为graphql字段的方法的每个模型。

    文档指定如何定义联合类型 through the inline style ,但我已经通过类型语言指定了模式。从我的模式中获取以下摘录:

    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;
        }
    

    当我通过一个提供者执行查询来检索服务时,我创建了一个 服务提供者实体 ,通过 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 还有我该回去的。

    0 回复  |  直到 6 年前
    推荐文章