php 对象 scalar,Scalar Types
内置标量类型
GraphQL 规范描述了几种内置的标量类型。在 graphql-php 中,它们作为 GraphQL\Type\Definition\Type 类的静态方法公开:
use GraphQL\Type\Definition\Type;
// 内置标量类型
Type::string(); // String 类型
Type::int(); // Int 类型
Type::float(); // Float 类型
Type::boolean(); // Boolean 类型
Type::id(); // ID 类型
这些方法返回 GraphQL\Type\Definition\ScalarType(实际上是其中一个子类)的实例。直接在类型定义中使用它们,或者包装在 TypeRegistry 中(如果使用的话)。
编写自定义标量类型
除了内置标量类型以外,你还可以使用其他的验证规则来定义你的标量类型。
这些类型中典型的例子如 邮箱 、 日期 、 链接 等等。
想要实现你自定义的类型,你必须了解 GraphQL 中标量是如何呈现的。
在 GraphQL 中以下情况会涉及到标量:
当转换应用程序返回的 内部表示 (例如存储在数据库或源码中的硬编码)为包含 序列化 表示的响应时。
当将客户端传入的 输入值 与 GraphQL 查询一起转换为应用程序的 内部表示 时。
将在 GraphQL 查询(例如字段参数值)中硬编码的 文字输入值 转化为应用程序的 内部表示 时。
这些情况由抽象类 ScalarType 中的 serialize 、parseValue 和 parseLiteral 方法来分别处理。
以下是一个 邮箱 类型的简单示例:
namespace MyApp;
use GraphQL\Error\Error;
use GraphQL\Error\InvariantViolation;
use GraphQL\Language\AST\StringValueNode;
use GraphQL\Type\Definition\ScalarType;
use GraphQL\Utils\Utils;
class EmailType extends ScalarType
{
// 注意:名称可以省略。在这种情况下它将从类名推断出来
// (「Type」前缀会被去掉)
public $name = 'Email';
/**
* 在响应中包含一个序列化的内部值
*
* @param string $value
* @return string
*/
public function serialize($value)
{
// 假设邮箱的内部表示总是正确的:
return $value;
// 如果它可能不正确,并且你想确保响应中只包含正确的值。
// 请使用下面的代码:
// if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
// throw new InvariantViolation("Could not serialize following value as email: " . Utils::printSafe($value));
// }
// return $this->parseValue($value);
}
/**
* 解析外部输入的值(查询变量)以用作输入
*
* @param mixed $value
* @return mixed
*/
public function parseValue($value)
{
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new Error("Cannot represent following value as email: " . Utils::printSafeJson($value));
}
return $value;
}
/**
* 解析外部输入的文字变量值(查询变量)以用作输入
*
* 例如:
* {
* user(email: "user@example.com")
* }
*
* @param \GraphQL\Language\AST\Node $valueNode
* @return string
* @throws Error
*/
public function parseLiteral($valueNode)
{
// 注意:抛出 GraphQL\Error\Error 比 \UnexpectedValueException 更有益于定位在
// GraphQL 查询的错误位置:
if (!$valueNode instanceof StringValueNode) {
throw new Error('Query error: Can only parse strings got: ' . $valueNode->kind, [$valueNode]);
}
if (!filter_var($valueNode->value, FILTER_VALIDATE_EMAIL)) {
throw new Error("Not a valid email", [$valueNode]);
}
return $valueNode->value;
}
}
或者使用行内样式:
use GraphQL\Type\Definition\CustomScalarType;
$emailType = new CustomScalarType([
'name' => 'Email',
'serialize' => function($value) {/* See function body above */},
'parseValue' => function($value) {/* See function body above */},
'parseLiteral' => function($valueNode) {/* See function body above */},
]);
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
php 对象 scalar,Scalar Types相关推荐
- Git 2.38发布,引入巨型仓库管理工具Scalar
出品 | OSC开源社区(ID:oschina2013) Git 2.38 已正式发布.此版本最值得关注的变化是引入微软创建的仓库管理工具 Scalar-- 用于处理巨型 Git 仓库. 引入巨型 G ...
- curve25519-dalek中Scalar的Montgomery inversion及batch_invert算法
根据资料[1]中定义, The Montgomery inverse of an integer a ∈ [1, p−1] is defined by Kaliski [3] as the integ ...
- OpenCL Data Types (数据类型)
OpenCL Data Types (数据类型) 1. Built-in Scalar Data Types - 内置标量数据类型 The following table describes the ...
- opencv3-Mat对象
我的实践: #include<opencv2\opencv.hpp> #include<iostream> #include<math.h> using names ...
- schema 对象的简单介绍
官方文档链接地址 http://docs.oracle.com/cd/E11882_01/server.112/e40540/tablecls.htm#CNCPT010 Introduction to ...
- CNN结构:MXNet设计和实现简介
对原文有大量修改,如有疑惑,请移步原文. 参考链接:MXNet设计和实现简介 文章翻译于:https://mxnet.incubator.apache.org/architecture/index.h ...
- 开源监控Prometheus介绍,安装,配置,使用详解
介绍 什么是Prometheus? Prometheus是一个开源监控系统,前身是SoundCloud的告警插件.从2012年开始,Prometheus逐渐被大量公司使用.该项目的社区也便跃起来,收到 ...
- OpenCV4一部分函数目录
OpenCV4函数+基本功能说明 引言 一.基础函数使用 Imread函数--读取图片 namedWindow函数--创建自定名窗口 imshow函数--将自定名的窗口展示 destroyWindow ...
- Pandas API参考
本文为谷歌翻译,有些翻译不准确 请参考原文档 http://pandas.pydata.org/pandas-docs/stable/api.html 此页面概述了所有公共pandas对象,函数和方法 ...
最新文章
- 【springmvc+mybatis项目实战】杰信商贸-16.新增从表货物信息
- 《软件观念革命——交互设计精髓》读书笔记(一)
- Python剑指offer:矩形覆盖问题
- 将不确定变为确定~整形变量是否可以进行位运算(像枚举类型一样)
- 城市需要建什么样的能源数据中心?
- 数据中心基础架构 22 年演进
- 从工作的角度,NLP/CV/推荐系统选哪个?
- Android常用类库包介绍
- OJ1065: 统计数字字符的个数(C语言)
- 服务器控件的 ID, ClientID 和 UniqueID 属性
- 0x08标志类型的RTMPE、RTMPTE协议分析
- 正则表达式,一篇就够了
- 共享打印机提示服务器没有运行,winXP共享打印机提示“工作站服务没有启动”|没有启动服务器Workstation服务...
- C/C++程序设计与算法第十一周:零点定理求方程的根
- 第3周项目1-顺序表的基本运算
- 近期有面试的必看!带你手撸红黑树,终获offer
- spring boot整合jsp报错 Whitelabel Error Page 500或者404 问题处理
- Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写
- navigationController的一些用法
- 【matplotlib】散点图详解