Я использую 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
и что я должен вернуть.