PSR 13 超媒体链接 - 说明文档
1. 摘要
超媒体链接正在日益成为 Web 中重要的一部分,常见于 HTML 上下文和各种 API 格式上下文中
但是,没有单一的通用超媒体格式,也没有通用的方法来表示格式之间的链接
本规范旨在为 PHP 开发人员提供一种表示超媒体链接的简单而通用的方法,这种方法用于独立于所使用的序列化格式
当然了,反过来说,又允许系统将超媒体链接的响应序列化为一种或多种格式,而不依赖于这些链接应该是什么
2. 正文
2.1 目标
- 本规范旨在从不同的格式中提取和标准化超媒体链接的表示方法
2.2 非目标
- 本规范并不尝试标准化或支持任何特定的超媒体序列化格式
3. 设计决策
为什么没有可伸缩的方法 ?
本规范的关键目标之一是 PSR-7 响应对象。响应对象 必须 是不可变更的。 其它的值对象实现可能还需要一个不可变的接口。
此外,某些链接提者对象可能不是值对象,而是给定域中的其它对象, 这些对象可能从一个数据库结果或其它基础的内容即时生成链接 在这些情况下,一个可写入的提供者定义是不兼容的
因此,本规范将访问器方法和伸缩方法分割为单独的接口,允许对象根据其用例实现只读或可伸缩版本
为什么一个链接的关系允许多个值 ?
不同的超媒体标准以不同的方式处理同一关系的多个链接。一些有单一的链接却定义了多个关系。其它的有着单一的关系却包含多个链接
把一个链接定义为唯一的但又允许具有多个链接关系看起来就像是一个最具兼容的分母定义。如果需要,可以根据给定的超链接格式将单个 LinkInterface
对象可以序列化为一个或多个链接实体
另一方发面,对于一个只有单一的链接关系但又包含了多个链接的对象,即使 URL 有重复那也是合法的。因为超媒体格式可以根据需要对其进行格式化
为什么需要 LinkProviderInterface 接口 ?
大多数的上下文中,会将一组链接附加到其它某个对象上。这些对象需要它们关联的链接的全部或链接的一部分:
- 例如,可以根据各种不同的 REST 格式 HAL,JSON-LD 或 Atom 定义各种不同的值对象
- 从这样的对象中均匀提取这些链接以进一步处理可能是有用的,例如可以从对象中提取下一个/上一个链接,并将其作为链接头部添加到 PSR-7 响应对象
- 许多链接都有 「预加载」 链接关系,这个关系用于向 HTTP 2 兼容的 Web 服务器指示链接的资源应该在随后的请求中流向客户端
所有这些情况都独立于对象的关键信息或编码。通过提供一个访问这些链接的通用接口,我们可以对链接本身进行处理,而不管生成它们的值对象或域对象如何
4. 参与人员
4.1 编撰者
- Larry Garfield
4.2 发起人
- Matthew Weier O'Phinney (coordinator)
- Marc Alexander
4.3 贡献者
- Evert Pot
5. 表决结果
6. 相关链接
- What's in a link? by Evert Pot
- FIG Link Working Group List