stagem/php-graphql-scalars

PHP 自定义 GraphQLScalars 库,用于创建精确的类型安全的 GraphQL 模式

dev-master 2020-06-11 07:43 UTC

This package is not auto-updated.

Last update: 2024-09-24 22:48:01 UTC


README

用于创建精确类型安全的 GraphQL 模式的自定义 GraphQL Scalars

需求

安装

  • 使用 composer: composer require stagem/php-graphql-scalars

  • 使用其他 PSR-4 兼容的自动加载器:将此项目克隆到包含库的目录中,并将自动加载器指向该项目的 "src" 目录中的 "\Stagem\GraphQL" 命名空间

可用类型

  • DateType
  • DateTimeType
  • IterableType
  • JsonType
  • EmailType
  • SimpleObjectType

DateType

日期字符串,例如 2012-12-31,符合 ISO 8601 标准中 5.6 节概述的完整日期格式,该格式用于表示公历日期和时间。

该标量是对日期的描述,例如用于生日等。它不能表示时间线上的瞬间。

DateTimeType

DateTime 标量类型表示时间数据,表示为 ISO-8601 编码的 UTC 日期字符串。

结果强制转换

PHP DateTimeDateTimeImmutable 实例被强制转换为符合 DateTimeInterface::ATOM(RFC 3339)的日期字符串。

输入强制转换

当预期为输入类型时,大多数有效的 ISO-8601 兼容日期字符串都被接受。

以下所有格式都是有效的,并且将被成功解析

  • "2010-12-07T23:00:00.000Z"
  • "2010-12-07T23:00:00"
  • "2010-12-07T23:00:00Z"
  • "2010-12-07T23:00:00+01:00"

IterableType & JsonType

任何有效的 JSON 格式。

SimpleObjectType

任何可以转换为数组的有效 PHP 对象。此外,支持 asArraytoArray 方法进行转换。

使用

简单创建 DateTimeType 并将其用于您的 GraphQL 模式。

请记住,任何类型都必须是唯一的。

<?php
use GraphQL\Type\Definition\Type;
use GraphQL\Type\Definition\ObjectType;
use Stagem\GraphQL\Type\DateTimeType;

$dateTimeType = new DateTimeType();

$queryType = new ObjectType([
    'name' => 'Query',
    'fields' => [
        'echoDate' => [
            'type' => Type::string(),
            'args' => [
                'date' => ['type' => $dateTimeType],
            ],
            'resolve' => function ($root, $args) {
                return $args['date'];
            }
        ],
    ],
]);

高级使用 使用 PSR-11 容器获取类型是一个好习惯。在以下示例中,我们使用 zendframework/zend-servicemanager,因为它提供了有用的概念,如:可调用的、别名、工厂和抽象工厂。但也可以使用其他 PSR-11 容器实现。

键应该是你在模型中引用类型的任何东西。通常这将是 PHP 类 "native" 类型的完全限定类名,如 DateTime,或者实现 GraphQL 类型的 PHP 类的完全限定类名,或者直接是 GraphQL 类型名

<?php
use GraphQL\Type\Definition\Type;
use GraphQL\Type\Definition\ObjectType;
use Stagem\GraphQL\Type\DateTimeType;
use Stagem\GraphQL\Type\JsonType;

$customTypes = new \Zend\ServiceManager\ServiceManager([
    'invokables' => [
        DateTime::class => DateTimeType::class,
        'Json' => JsonType::class,
    ],
]);

$queryType = new ObjectType([
    'name' => 'Query',
    'fields' => [
        'echoDate' => [
            'type' => Type::string(),
            'args' => [
                'date' => ['type' => $customTypes->get(DateTime::class)],
            ],
            'resolve' => function ($root, $args) {
                return $args['date'];
            }
        ],
    ],
]);

这样就不需要为每个返回配置类型之一的获取器进行注释。它将自动映射。

贡献

请随时使用 问题选项卡 报告错误或请求功能。如果你想贡献,请随意fork我们的仓库,并提交带有修改的 pull request。让我们一起让它变得更好!

历史记录

当我们开始使用 GraphGL 时,没有人创建具有有用自定义 GraphQL 类型的库,这很奇怪。

在网络搜索中,我们发现了许多关于在GraphQL中包含此类类型的建议(例如一个两个),但所有这些都被拒绝了。

其他库只是相互复制,创建了各自的内部类型。

之后,我们决定纠正这种不公正的做法,并创建了此库,每个人都可以使用它而无需复制粘贴。

我们的灵感来自okgrow/graphql-scalars,但这并不是该库的移植。