
# 先决条件

 本文档假定你熟悉 GraphQL 的概念。 如果不是这样，请首先在 [官方网站](http://graphql.org/learn/) 上面了解 GraphQL。

# 安装

使用 [composer](https://getcomposer.org/doc/00-intro.md)，只需要在终端里边运行已下命令:

```sh
composer require webonyx/graphql-php
```


# 升级

我们尽量保证类库的版本向后兼容。但是，当一些变化不可避免时，他们会在 [升级说明](https://github.com/webonyx/graphql-php/blob/master/UPGRADE.md) 中进行说明。

# 安装工具（可选）

尽管可以使用常规的 HTTP 工具与 GraphQL API 进行通信，但人们使用 [GraphiQL](https://github.com/graphql/graphiql)（浏览器内置的 IDE ）更便于探索 GraphQL API。

它为 GraphQL API 提供语法高亮显示，自动完成和自动生成文档。

使用它的最简单方法是安装一个 Google Chrome 浏览器扩展程序：

 - [ChromeiQL](https://chrome.google.com/webstore/detail/chromeiql/fkkiamalmpiidkljmicmjfbieiclmeij)
 - [GraphiQL Feen](https://chrome.google.com/webstore/detail/graphiql-feen/mcbfdonlkfpbfdpimkjilhdneikhfklp)

或者，你可以按照 [GraphiQL](https://github.com/graphql/graphiql)
页面上的说明进行安装。



# Hello World
让我创建一个能够处理以下简单查询的类型系统：
```
query {
  echo(message: "Hello World")
}
```

为此，我们需要构建一个包含 `echo` 字段的类型对象： 

```php
<?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'];
            }
        ],
    ],
]);

```

（注意：类型定义可以使用 [不同的方式](${doc_url}/type-system-introduction#type-definition-styles) 来表达，本示例为了简便而使用了 **内联（inline）** 的样式）

这里有趣的是 **resolve** 的字段定义，它负责返回我们类型对象的值。**scalar** 将直接包含在响应中，而
**composite** 字段（对象、接口、组合）的值将会传递给嵌套字段解析器（但没在本例中）。

现在我们的类型对象已经准备好了，接下来为它创建一个名为 **graphql.php** 的 GraphQL 终端文件：

```php
<?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);
```

我们的示例完成了，试着运行一下：
```sh
php -S localhost:8080 graphql.php
curl http://localhost:8080 -d '{"query": "query { echo(message: \"Hello World\") }" }'
```

查看本示例的完整 [源代码](https://github.com/webonyx/graphql-php/blob/master/examples/00-hello-world) ，其中还包括简单的变动。

很明显，Hello World 的示例仅仅展示了它的冰山一角。因此请开始下一个更接近真实应用的示例，或者继续阅读 [Schema 定义](${doc_url}/type-system-introduction) 。



# 博客示例

从一个具有全功能的实际示例开始学习，然后再返回到文档通常会更便于理解。

查看 [博客示例 GraphQL API](https://github.com/webonyx/graphql-php/tree/master/examples/01-blog)。它非常接近于我们在实际工作中开发 GraphQL 的层次结构。 按照说明，并在大约10分钟内尝试一下。