Я совершенно новичок в GraphQL и хотел поиграть с graphql-php, чтобы создать простой API для начала работы. В настоящее время я читаю документы и пробую примеры, но я застрял в самом начале.
Я хочу, чтобы моя схема была сохранена в файле schema.graphql
вместо ее создания вручную, поэтому я следовал документации, как это сделать, и она действительно работает:
<?php
// graph-ql is installed via composer
require('../vendor/autoload.php');
use GraphQL\Language\Parser;
use GraphQL\Utils\BuildSchema;
use GraphQL\Utils\AST;
use GraphQL\GraphQL;
try {
$cacheFilename = 'cached_schema.php';
// caching, as recommended in the docs, is disabled for testing
// if (!file_exists($cacheFilename)) {
$document = Parser::parse(file_get_contents('./schema.graphql'));
file_put_contents($cacheFilename, "<?php\nreturn " . var_export(AST::toArray($document), true) . ';');
/*} else {
$document = AST::fromArray(require $cacheFilename); // fromArray() is a lazy operation as well
}*/
$typeConfigDecorator = function($typeConfig, $typeDefinitionNode) {
// In the docs, this function is just empty, but I needed to return the $typeConfig, otherwise I got an error
return $typeConfig;
};
$schema = BuildSchema::build($document, $typeConfigDecorator);
$context = (object)array();
// this has been taken from one of the examples provided in the repo
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
$variableValues = isset($input['variables']) ? $input['variables'] : null;
$rootValue = ['prefix' => 'You said: '];
$result = GraphQL::executeQuery($schema, $query, $rootValue, $context, $variableValues);
$output = $result->toArray();
} catch (\Exception $e) {
$output = [
'error' => [
'message' => $e->getMessage()
]
];
}
header('Content-Type: application/json; charset=UTF-8');
echo json_encode($output);
Вот как выглядит мой schema.graphql
файл:
schema {
query: Query
}
type Query {
products: [Product!]!
}
type Product {
id: ID!,
type: ProductType
}
enum ProductType {
HDRI,
SEMISPHERICAL_HDRI,
SOUND
}
Я могу запросить его, например, с помощью
query {
__schema {types{name}}
}
и это вернет метаданные, как и ожидалось. Но, конечно, теперь я хочу запросить фактические данные о продукте и получить их из базы данных, и для этого мне нужно определить функцию распознавателя.
Документы на http://webonyx.github.io/graphql-php/type-system/type-language/ гласят: «По умолчанию такая схема создается без каких-либо распознавателей. Для выполнения запроса к этой схеме мы должны полагаться на преобразователь полей по умолчанию и корневое значение». - но нет примера для этого.
Как добавить функции распознавателя для каждого из типов / полей?