dpauli/graphql-request-builder

GraphQL 负载请求构建器

1.8.0 2021-05-13 20:07 UTC

This package is not auto-updated.

Last update: 2024-09-16 15:53:41 UTC


README

Latest Stable Version Total Downloads License UnitTests

此库用于构建发送到 GraphQL 服务器的请求。

什么是 GraphQL?

GraphQL 是一种查询语言,便于从远程 Web 服务器请求数据。与 REST 相比,使用 GraphQL 有以下优点:

  • 减少请求数量
  • 节省负载中的流量
  • 避免在客户端请求的数据更改时修改后端

有关完整描述,请参阅 如何使用 GraphQL

命名约定

GraphQL 的模式由两个简单属性定义:

  • 类型
  • 参数

类型 定义结构化请求数据对象。参数可以定义这些类型。

示例

类型 forum 可以有 posts,其中包含 authorstitle。如果您想以响应的形式接收所有 authorpost 标题信息,您的请求可以如下所示:

{
  forum {
    posts {
      authors,
      title
    }
  }
}

要指定仅请求最后 5 个 posts 的请求,您可以修改您的请求如下所示:

{
  forum {
    posts(last: 5) {
      authors,
      title
    }
  }
}

GraphQL 请求的数据可以复杂到您想要的程度。

{
  forum {
    posts(last: 5) {
      authors(registration: {date: "2019-08-08"}, visible: true) {
        surname,
        prename(startingWith: "a"),
        birthday
      },
      title
    },
    users(last: 10, sort: "registrationDate", order: "DESC")
  }
}

为什么选择这个库?

此库帮助构建此 负载结构 而无需任何 字符串 连接或其他奇怪的想法。

示例

要创建以下请求负载:

{
  field {
    search(criteria: {start: "2019-08-23"}) {
      errors {
        code
        type
        description
      }
      id
    }
  }
}

您需要执行以下 PHP 代码:

<?php
declare(strict_types=1);

use GraphQL\RequestBuilder\Argument;
use GraphQL\RequestBuilder\RootType;
use GraphQL\RequestBuilder\Type;

$searchType = (new Type('search'))
    ->addArgument(new Argument('criteria', new Argument('start', '2019-08-23')))
    ->addSubTypes([
        (new Type('errors'))->addSubTypes(['code', 'type', 'description']),
        'id'
    ]
);

echo (string) (new RootType('field'))->addSubType($searchType);

构建复杂类型

也可以构建复杂类型。以下代码示例展示了如何做到这一点。

具有数组参数的参数

有时您想具有复杂 参数 类型的数组,如下例所示。

{
  persons: [
    {age: 30},
    {age: 20},
    {age: 12}
  ]
}

为此概念,您可以使用类 ArrayArgument,它提供了向数组添加 参数 的可能性。

<?php
declare(strict_types=1);

use GraphQL\RequestBuilder\Argument;
use GraphQL\RequestBuilder\ArrayArgument;

$persons = new ArrayArgument(
    'persons',
    [new Argument('age', 30), new Argument('age', 20), new Argument('age', 12)]
);

具有多个参数的数组。

上面的示例在您只有一个 参数 的数组时有效:每个 person 只有一个 参数,即 age。如果您想要更多的 参数,您需要创建一个带有空名称的 参数

{
  persons: [
    {
      name: "Hans",
      age: 30
    },
    {
      name: "Max",
      age: 20
    }
  ]
}

您的 PHP 代码应如下所示:

<?php
declare(strict_types=1);

use GraphQL\RequestBuilder\Argument;
use GraphQL\RequestBuilder\ArrayArgument;

$person1 = new ArrayArgument('', [new Argument('name', 'Hans'), new Argument('age', 30)]);
$person2 = new ArrayArgument('', [new Argument('name', 'Max'), new Argument('age', 20)]);

$persons = new ArrayArgument('persons', [$person1, $person2]);

枚举参数

要创建枚举参数,它应如下所示:

<?php
declare(strict_types=1);

use GraphQL\RequestBuilder\EnumArgument;

$person1 = new EnumArgument('EnumAttribute', 'EnumValue');