stagem / php-graphql-scalars
PHP 自定义 GraphQLScalars 库,用于创建精确的类型安全的 GraphQL 模式
Requires
- php: >=7.2
This package is not auto-updated.
Last update: 2024-09-24 22:48:01 UTC
README
用于创建精确类型安全的 GraphQL 模式的自定义 GraphQL Scalars
需求
- PHP 7.2+
- PHP Webonyx GraphQL
安装
-
使用 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 DateTime
或 DateTimeImmutable
实例被强制转换为符合 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 对象。此外,支持 asArray
和 toArray
方法进行转换。
使用
简单创建 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,但这并不是该库的移植。