[TOC]
#### 定義
枚舉類型是一種特殊的標量,限于特定的允許值集合。
枚舉類型是 GraphQL\Type\Definition\EnumType (或它的子類) 的實例,它的構造函數接收數組配制參數:
~~~
$episodeEnum = new EnumType([
'name' => 'Episode',
'description' => 'One of the films in the Star Wars Trilogy',
'values' => [
'NEWHOPE' => [
'value' => 4,
'description' => 'Released in 1977.'
],
'EMPIRE' => [
'value' => 5,
'description' => 'Released in 1980.'
],
'JEDI' => [
'value' => 6,
'description' => 'Released in 1983.'
],
]
]);
~~~
上面的例子用的是內聯樣式定義 EnumType,同樣你也可以使用繼承的方式定義。
#### 配制項
|名稱 |類型 |描述 |
| --- | --- | --- |
| name | `string` | `必填` 類型名字 |
| description | `string` | 類型的純文本描述(例如通過GraphQL自動生成文檔) |
| values | `array` | 枚舉項列表,請參閱下面每個條目的預期結構 |
#### 值配制
values數組的每個條目依次接受以下選項:
| 名稱 | 類型 | 描述 |
| --- | --- | --- |
| name | `string` | `必填` 枚舉項的名字,當沒有指明時,則取數組key值 |
| value | `mixed` | 你應用中 枚舉項的內部表示,可以是任意值(包括 復雜對象 及 callbacks) |
| description | `string` | 類型的純文本描述(例如通過GraphQL自動生成文檔) |
| deprecationReason | `string` | 該枚舉值棄用原因的描述信息,當不為空時,內省查詢 將不返回該字段 (除非includeDeprecated: true,詳情請看 內省機制) |
當枚舉項的內部表示(即枚舉項對應的value值)與該名稱相同時,可以使用如下
~~~
$episodeEnum = new EnumType([
'name' => 'Episode',
'description' => 'One of the films in the Star Wars Trilogy',
'values' => ['NEWHOPE', 'EMPIRE', 'JEDI']
]);
~~~
等同于:
~~~
$episodeEnum = new EnumType([
'name' => 'Episode',
'description' => 'One of the films in the Star Wars Trilogy',
'values' => [
'NEWHOPE' => 'NEWHOPE',
'EMPIRE' => 'EMPIRE',
'JEDI' => 'JEDI'
]
]);
~~~
等同于
~~~
$episodeEnum = new EnumType([
'name' => 'Episode',
'description' => 'One of the films in the Star Wars Trilogy',
'values' => [
'NEWHOPE' => ['value' => 'NEWHOPE'],
'EMPIRE' => ['value' => 'EMPIRE'],
'JEDI' => ['value' => 'JEDI']
]
]);
~~~
等同于完整形式
~~~
$episodeEnum = new EnumType([
'name' => 'Episode',
'description' => 'One of the films in the Star Wars Trilogy',
'values' => [
['name' => 'NEWHOPE', 'value' => 'NEWHOPE'],
['name' => 'EMPIRE', 'value' => 'EMPIRE'],
['name' => 'JEDI', 'value' => 'JEDI']
]
]);
~~~
#### 字段解析
**對象字段類型是枚舉類型**
當對象字段的類型是枚舉類型時,字段解析器(resolve)期望返回相應的枚舉項的內部表示(即枚舉項的value值),graphql-php然后將該值序列化為名稱以包含在響應中。即最后返給客戶端的字段值是枚舉項名稱(如上面的 NEWHOPE 字符串而非真實值 4)。
**當枚舉被使用作為輸入類型**
當枚舉類型作為輸入類型使用時(如字段參數 field argument),GraphQL會將枚舉輸入視為名稱,并將其轉成對應的值 ( value ) ,然后傳遞給相應的處理程序。這里說明在client查詢體中,傳遞的字段參數是名稱而非對應的值,且不能加引號,如:
~~~
$heroType = new ObjectType([
'name' => 'Hero',
'fields' => [
'appearsIn' => [
'type' => Type::boolean(),
'args' => [
'episode' => Type::nonNull($enumType)
]
'resolve' => function($_value, $args) {
return $args['episode'] === 5 ? true : false;
}
]
]
])
~~~
客戶端查詢語句
~~~
fragment on Hero {
appearsInNewHope: appearsIn(episode:NEWHOPE)
}
~~~
**注意**
如果字段類型是枚舉類型,且其枚舉項對應的值(value)是標量(可以是數組),字段解析器(resolve)的值返回類型不同, 只要最終 == 比較相等,則不會出錯;但如果枚舉項對應的值是對象類型,則會做 === 比較。比如 枚舉項值是 1 而 resolve最終返回字符串 "1",不會出錯。而如果字段類型是ObjectArray(等其他對象),則始終出錯,除非它們引用同一個對象。