[toc]
#### 定義
schema 是你的類型層次結構的容器,它的構造函數接收根類型(root-level type),并且向內部GraphQL工具提供接收有關類型信息的方法。
schema 是 `GraphQL\Schema` ( 或其子類 )的實例,它的構造函數接收數組配制參數。
~~~
$schema = new Schema([
'query' => $queryType,
'mutation' => $mutationType,
]);
~~~
#### Query and Mutation types
Schema由兩個` root types` 組成。
* Query type 是 read API 的接口
* Mutation type(可選) 是你應用中定義的所有可能的操作的公共的 write API
查詢和更改類型是包含你的API的`root-level fields`的常規 `object types `。
~~~
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\Schema;
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'hello' => [
'type' => Type::string(),
'resolve' => function() {
return 'Hello World!';
}
]
'hero' => [
'type' => $characterInterface,
'args' => [
'episode' => [
'type' => $episodeEnum
]
],
'resolve' => function ($rootValue, $args) {
return StarWarsData::getHero(isset($args['episode']) ? $args['episode'] : null);
},
]
]
]);
$mutationType = new ObjectType([
'name' => 'Mutation',
'fields' => [
'createReviewForEpisode' => [
'type' => $createReviewForEpisodeMutation,
'args' => [
'episode' => $episodeEnum,
'review' => $reviewInputObject
],
'resolve' => function($val, $args) {
// TODOC
}
]
]
]);
~~~
請注意:除了是聲明你的API接口的表層外,這些類型和其他的`object type`是一樣的,并且字段的工作也是一樣的。
`Mutation` 類型同樣僅僅是常規對象類型,區別在于主義,`Mutation`類型的字段名字通常是動詞 并且 他們幾乎總是有參數 - 一些常常是復雜輸入的值(`Input Types`,如新增一條數據)
#### 配制項
| 名字 | 類型 | 描述 |
| --- | --- | --- |
| query | `ObjectType` | 包含 read API 的 root-level 字段的對象類型 (通常命名 "Query") |
| mutation | `ObjectType` | 包含 write API 的 root-level 字段的對象類型 (通過命名 "Mutation")。 |
| subscription | `ObjectType` | 預留供將來訂閱實現,當前提供是為了兼容 graphql-js 的內省查詢。 |
| directives | `Directive[] ` | 你的schema支持的指令的完整列表。默認包含內建的 @skip and @include。<br>如是你要傳遞自己的指令并且仍然想使用內建的指定 :array_merge(GraphQL::getInternalDirectives(), [$myCustomDirective]) |
| types | `ObjectType[]` | 在 靜態模式分析 (static schema analysis)期間無法由graphql檢測的對象類型列表。通常發生在對象類型沒有被字段直接引用,但是仍然是schema的一部分,這是因為它實現了接口(union type因為有types字段,可以被分析器檢測),接口在resolveType 回調中解析為這個對象類型。 |