我在用
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
还有我该回去的。