内置标量类型

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相关推荐

  1. Git 2.38发布,引入巨型仓库管理工具Scalar

    出品 | OSC开源社区(ID:oschina2013) Git 2.38 已正式发布.此版本最值得关注的变化是引入微软创建的仓库管理工具 Scalar-- 用于处理巨型 Git 仓库. 引入巨型 G ...

  2. 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 ...

  3. OpenCL Data Types (数据类型)

    OpenCL Data Types (数据类型) 1. Built-in Scalar Data Types - 内置标量数据类型 The following table describes the ...

  4. opencv3-Mat对象

    我的实践: #include<opencv2\opencv.hpp> #include<iostream> #include<math.h> using names ...

  5. schema 对象的简单介绍

    官方文档链接地址 http://docs.oracle.com/cd/E11882_01/server.112/e40540/tablecls.htm#CNCPT010 Introduction to ...

  6. CNN结构:MXNet设计和实现简介

    对原文有大量修改,如有疑惑,请移步原文. 参考链接:MXNet设计和实现简介 文章翻译于:https://mxnet.incubator.apache.org/architecture/index.h ...

  7. 开源监控Prometheus介绍,安装,配置,使用详解

    介绍 什么是Prometheus? Prometheus是一个开源监控系统,前身是SoundCloud的告警插件.从2012年开始,Prometheus逐渐被大量公司使用.该项目的社区也便跃起来,收到 ...

  8. OpenCV4一部分函数目录

    OpenCV4函数+基本功能说明 引言 一.基础函数使用 Imread函数--读取图片 namedWindow函数--创建自定名窗口 imshow函数--将自定名的窗口展示 destroyWindow ...

  9. Pandas API参考

    本文为谷歌翻译,有些翻译不准确 请参考原文档 http://pandas.pydata.org/pandas-docs/stable/api.html 此页面概述了所有公共pandas对象,函数和方法 ...

最新文章

  1. 【springmvc+mybatis项目实战】杰信商贸-16.新增从表货物信息
  2. 《软件观念革命——交互设计精髓》读书笔记(一)
  3. Python剑指offer:矩形覆盖问题
  4. 将不确定变为确定~整形变量是否可以进行位运算(像枚举类型一样)
  5. 城市需要建什么样的能源数据中心?
  6. 数据中心基础架构 22 年演进
  7. 从工作的角度,NLP/CV/推荐系统选哪个?
  8. Android常用类库包介绍
  9. OJ1065: 统计数字字符的个数(C语言)
  10. 服务器控件的 ID, ClientID 和 UniqueID 属性
  11. 0x08标志类型的RTMPE、RTMPTE协议分析
  12. 正则表达式,一篇就够了
  13. 共享打印机提示服务器没有运行,winXP共享打印机提示“工作站服务没有启动”|没有启动服务器Workstation服务...
  14. C/C++程序设计与算法第十一周:零点定理求方程的根
  15. 第3周项目1-顺序表的基本运算
  16. 近期有面试的必看!带你手撸红黑树,终获offer
  17. spring boot整合jsp报错 Whitelabel Error Page 500或者404 问题处理
  18. Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写
  19. navigationController的一些用法
  20. 【matplotlib】散点图详解

热门文章

  1. transform属性
  2. Matlab随笔之三维图形绘制
  3. CCF NOI1079 合法C标识符
  4. HDU1201 18岁生日【日期计算+水题】
  5. 贝叶斯统计(Bayesian statistics) vs 频率统计(Frequentist statistics):marginal likelihood(边缘似然)
  6. Logistic Regression 的简单推导
  7. 心理学家、实验与效应
  8. C Tricks(十三)—— trim 的实现
  9. macos 开发环境配置
  10. Tricks(十七) —— 数组与字典(map)