入门
先决条件
本文档假定你熟悉 GraphQL 的概念。 如果不是这样,请首先在 官方网站 上面了解 GraphQL。
安装
使用 composer,只需要在终端里边运行已下命令:
composer require webonyx/graphql-php
升级
我们尽量保证类库的版本向后兼容。但是,当一些变化不可避免时,他们会在 升级说明 中进行说明。
安装工具(可选)
尽管可以使用常规的 HTTP 工具与 GraphQL API 进行通信,但人们使用 GraphiQL(浏览器内置的 IDE )更便于探索 GraphQL API。
它为 GraphQL API 提供语法高亮显示,自动完成和自动生成文档。
使用它的最简单方法是安装一个 Google Chrome 浏览器扩展程序:
或者,你可以按照 GraphiQL
页面上的说明进行安装。
Hello World
让我创建一个能够处理以下简单查询的类型系统:
query {
echo(message: "Hello World")
}
为此,我们需要构建一个包含 echo
字段的类型对象:
<?php
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'echo' => [
'type' => Type::string(),
'args' => [
'message' => Type::nonNull(Type::string()),
],
'resolve' => function ($root, $args) {
return $root['prefix'] . $args['message'];
}
],
],
]);
(注意:类型定义可以使用 不同的方式 来表达,本示例为了简便而使用了 内联(inline) 的样式)
这里有趣的是 resolve 的字段定义,它负责返回我们类型对象的值。scalar 将直接包含在响应中,而
composite 字段(对象、接口、组合)的值将会传递给嵌套字段解析器(但没在本例中)。
现在我们的类型对象已经准备好了,接下来为它创建一个名为 graphql.php 的 GraphQL 终端文件:
<?php
use GraphQL\GraphQL;
use GraphQL\Type\Schema;
$schema = new Schema([
'query' => $queryType
]);
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
$variableValues = isset($input['variables']) ? $input['variables'] : null;
try {
$rootValue = ['prefix' => 'You said: '];
$result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
$output = $result->toArray();
} catch (\Exception $e) {
$output = [
'errors' => [
[
'message' => $e->getMessage()
]
]
];
}
header('Content-Type: application/json');
echo json_encode($output);
我们的示例完成了,试着运行一下:
php -S localhost:8080 graphql.php
curl http://localhost:8080 -d '{"query": "query { echo(message: \"Hello World\") }" }'
查看本示例的完整 源代码 ,其中还包括简单的变动。
很明显,Hello World 的示例仅仅展示了它的冰山一角。因此请开始下一个更接近真实应用的示例,或者继续阅读 Schema 定义 。
博客示例
从一个具有全功能的实际示例开始学习,然后再返回到文档通常会更便于理解。
查看 博客示例 GraphQL API。它非常接近于我们在实际工作中开发 GraphQL 的层次结构。 按照说明,并在大约10分钟内尝试一下。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。