翻译进度
3
分块数量
3
参与人数

简介

这是一篇社区协同翻译的文章,你可以点击右边区块信息里的『改进』按钮向译者提交改进建议。

类型系统

要开始使用 GraphQL,你需要实现一个类型层次结构并将其公开为 Schema

在 graphql-php 中,类型 是内部类 GraphQL\Type\Definition 命名空间的实例:ObjectType,
InterfaceType, UnionType, InputObjectType,
ScalarType, EnumType (或他们的子类之一)。

但架构中的大多数类型都是 对象类型

Ellison 翻译于 4个月前

类型定义样式

根据你的需求,支持多种类型的定义样式。

内联定义:

<?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
}

专门的文档章节 阅读关于类型语言定义的更多信息。

Ellison 翻译于 4个月前

类型注册

每一个类型必须在 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() 的形式了。

Honvid 翻译于 4个月前

本文章首发在 Laravel China 社区
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

参与译者:3
讨论数量: 0
发起讨论


暂无话题~