skillshare/apollo-federation-php

Apollo Federation规范的PHP端口。

v1.9 2023-12-01 20:34 UTC

README

本软件包提供用于在PHP中创建由Apollo网关消费的webonyx/graphql-php类和工具,以创建联邦GraphQL子图

⚠️ 重要: 本软件包仍在积极开发中,可能会引入破坏性更改。

使用方法

通过composer

composer require skillshare/apollo-federation-php

实体

实体是一个对象类型,您可以在一个子图中正确定义,然后可以在其他子图中引用和扩展。它可以通过具有相同配置的EntityObjectType定义,包括keyFields__resolveReference属性。

use Apollo\Federation\Types\EntityObjectType;

$userType = new EntityObjectType([
    'name' => 'User',
    'keyFields' => ['id', 'email'],
    'fields' => [
        'id' => ['type' => Type::int()],
        'email' => ['type' => Type::string()],
        'firstName' => ['type' => Type::string()],
        'lastName' => ['type' => Type::string()]
    ],
    '__resolveReference' => static function ($ref) {
        // .. fetch from a data source.
    }
]);
  • keyFields - 定义实体的主键,它由一个或多个类型组成。实体的键不能包括返回联合或接口的字段。

  • __resolveReference - 从提供的引用解析实体的表示。子图使用表示从其他子图引用实体。表示只需要显式定义 __typename 和实体主键字段值。

有关实体的更多详细信息,请参阅官方文档

实体引用

子图可以通过定义一个包含足够信息以了解如何与引用的实体交互的存根来引用另一个子图中的实体。实体引用通过具有相同配置的EntityRefObjectType创建。

use Apollo\Federation\Types\EntityRefObjectType;

$userType = new EntityRefObjectType([
    'name' => 'User',
    'keyFields' => ['id', 'email'],
    'fields' => [
        'id' => ['type' => Type::int()],
        'email' => ['type' => Type::string()]
    ]
]);

有关实体引用的更多详细信息,请参阅官方文档

扩展

子图可以向在另一个子图中定义的实体添加字段,这称为扩展实体。当子图扩展实体时,实体的原始子图不知道添加的字段。只有扩展子图(以及网关)知道这些字段。

use Apollo\Federation\Types\EntityRefObjectType;

$userType = new EntityRefObjectType([
    'name' => 'User',
    'keyFields' => ['id', 'email'],
    'fields' => [
        'id' => [
            'type' => Type::int(),
            'isExternal' => true
        ],
        'email' => [
            'type' => Type::string(),
            'isExternal' => true
        ]
    ]
]);

子图可以使用以下配置属性进行扩展

  • isExternal - 将字段标记为属于另一个服务。这允许服务A使用服务B的字段,同时知道在运行时该字段的类型。

  • provides - 用于注释从基本类型返回的预期字段集,该基本类型保证可由网关选择。

  • requires - 用于注释解析器所需的基本类型输入字段集。它用于开发查询计划,其中可能不需要客户端所需的所有字段,但服务可能需要从其他服务获取附加信息。

联邦模式

FederatedSchema类扩展自基础GraphQL\Schema类,并使用实体类型和联邦字段注解以及Apollo Federation元数据增强模式配置。有关更多信息,请参阅文档

use GraphQL\GraphQL;
use Apollo\Federation\FederatedSchema;


$schema = new FederatedSchema($config);
$query = 'query GetServiceSDL { _service { sdl } }';

$result = GraphQL::executeQuery($schema, $query);

配置

FederatedSchema对象的配置参数完全兼容Schema配置参数。除此之外,我们还支持以下可选参数

  1. entityTypes - 将构成联邦模式中_Entity类型的实体类型(这些类型扩展自EntityObjectType)。如果没有提供,Schema将扫描Query类型树,以查找所有扩展自EntityObjectType的类型。

免责声明

本项目中的文档包括直接引用自Apollo官方文档的内容,以减少冗余。