简介
类型系统
要开始使用 GraphQL,你需要实现一个类型层次结构并将其公开为 Schema。
在 graphql-php 中,类型 是内部类 GraphQL\Type\Definition
命名空间的实例:ObjectType
,InterfaceType
, UnionType
, InputObjectType
,ScalarType
, EnumType
(或他们的子类之一)。
但架构中的大多数类型都是 对象类型。
类型定义样式
根据你的需求,支持多种类型的定义样式。
内联定义:
<?php
namespace MyApp;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
$myType = new ObjectType([
'name' => 'MyType',
'fields' => [
'id' => Type::id()
]
]);
每个单独类的类别:
<?php
namespace MyApp;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
class MyType extends ObjectType
{
public function __construct()
{
$config = [
// 注意:这个表单中不需要 'name' 字段:
// 通过省略命名空间并删除 “Type” 后缀从类名推断出它
'fields' => [
'id' => Type::id()
]
];
parent::__construct($config);
}
}
使用 GraphQL 类型语言:
schema {
query: Query
mutation: Mutation
}
type Query {
greetings(input: HelloInput!): String!
}
input HelloInput {
firstName: String!
lastName: String
}
在 专门的文档章节 阅读关于类型语言定义的更多信息。
类型注册
每一个类型必须在 Schema 中作为一个单独的实例呈现(当 Schema 中存在多个重 名 的实例时,graphql-php 将会抛出异常)。
因此,如果你将你的类型定义为单独的 PHP 类,则必须确保该类只有一个实例被添加到 Schema 中。
以上场景的典型解决方法是为所有的类型创建一个注册类:
<?php
namespace MyApp;
class TypeRegistry
{
private $myAType;
private $myBType;
public function myAType()
{
return $this->myAType ?: ($this->myAType = new MyAType($this));
}
public function myBType()
{
return $this->myBType ?: ($this->myBType = new MyBType($this));
}
}
然后,在类型定义中使用这个注册类:
<?php
namespace MyApp;
use GraphQL\Type\Definition\ObjectType;
class MyAType extends ObjectType
{
public function __construct(TypeRegistry $types)
{
parent::__construct([
'fields' => [
'b' => $types->myBType()
]
]);
}
}
显然,你可以自动注入这个注册类来减少样板代码,或者你的类型拥有其他的依赖关系,则可以引入依赖注入容器(Dependency Injection Container)。
甚至,注册类的所有方法都是可以静态的(就不需要通过构造方法传递了), 这样就可以在类型定义中使用 TypeRegistry::myAType() 的形式了。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。