1. 程式人生 > >PHP規範PSR13(連結定義介面)介紹

PHP規範PSR13(連結定義介面)介紹

在HTML上下文和各種API格式上下文中,超媒體連結正變得越來越重要。但是,沒有單一的常見超媒體格式,也沒有一種通用的方式來表示格式之間的連結。

該規範旨在為PHP開發人員提供一種簡單,通用的方式來表示超媒體連結,而不依賴於所使用的序列化格式。這反過來允許系統將具有超媒體連結的響應序列化為一種或多種有線格式,而與決定這些連結應該是什麼的過程無關。

本文件中的關鍵詞“必須”,“必須”,“必需”,“應該”,“不應該”,“應該”,“不應該”,“推薦”,“可以”和“可選”按照RFC 2119中的描述進行解釋。

1 規格

1.1 基本連結

超媒體連結至少包括:

  • 表示正在引用的目標資源的URI。
  • 定義目標資源與源相關的關係。

根據使用的格式,可能存在連結的各種其他屬性。由於附加屬性沒有很好地標準化或通用,因此本規範並未尋求將它們標準化。

出於本說明書的目的,以下定義適用。

  • 實現Object -An實現此規範定義的介面之一的物件。
  • Serializer - 一個庫或其他系統,它接受一個或多個Link物件並以某種定義的格式生成它的序列化表示。

1.2 屬性

除URI和關係外,所有連結可以包含零個或多個附加屬性。此處不允許使用正式的值登錄檔,值的有效性取決於上下文,通常取決於特定的序列化格式。常用的值包括'hreflang','title'和'type'。

如果需要通過序列化格式,序列化程式可以省略連結物件上的屬性。但是,序列化程式應該儘可能編碼所有提供的屬性,以便允許使用者擴充套件,除非序列化格式的定義阻止。

某些屬性(通常是hreflang)可能在其上下文中出現不止一次。因此,屬性值可以是值陣列而不是簡單值。 Serializers可以以適合序列化格式的任何格式(例如以空格分隔的列表,以逗號分隔的列表等)編碼該陣列。如果不允許給定屬性在特定上下文中具有多個值,則序列化器必須使用提供的第一個值並忽略所有後續值。

如果屬性值為布林值true,則序列化程式可以使用縮寫形式(如果適用)並由序列化格式支援。例如,當屬性的存在具有布林含義時,HTML允許屬性沒有值。當且僅當屬性為布林值true時才適用此規則,而不適用於PHP中的任何其他“truthy”值,例如整數1。

如果屬性值是布林值false,序列化程式應該完全省略該屬性,除非這樣做會改變結果的語義。當且僅當屬性為布林值false時才適用此規則,而不適用於PHP中的任何其他“falsey”值,例如整數0。

1.3 關係

連結關係定義為字串,在公開定義的關係中是簡單關鍵字,在私有關係的情況下是絕對URI。

如果使用簡單的關鍵字,它應該與IANA登錄檔中的一個匹配:

http://www.iana.org/assignments/link-relations/link-relations.xhtml

可選地,可以使用microformats.org登錄檔,但這可能在每個上下文中都無效:

http://microformats.org/wiki/existing-rel-values

未在上述登錄檔之一或類似公共註冊中心中定義的關係被視為“私有”,即特定於特定應用程式或用例。這種關係必須使用絕對URI。

1.4 連結模板

RFC 6570定義了URI模板的格式,即URI的模式,預期用客戶端工具提供的值填充。一些超媒體格式支援模板化連結,而其他格式不支援,並且可能有一種特殊方式來表示連結是模板。用於不支援URI模板的格式的Serializer必須忽略它遇到的任何模板化連結。

1.5 Evolvable提供者

在某些情況下,連結提供商可能需要能夠新增其他連結。在其他情況下,連結提供程式必須是隻讀的,其中連結在執行時從某些其他資料來源派生。因此,可修改的提供程式是可以選擇實現的輔助介面。

此外,某些連結提供程式物件(如PSR-7響應物件)在設計上是不可變的。這意味著在原地新增連結的方法將是不相容的。因此,EvolvableLinkProviderInterface的單個方法要求返回一個新物件,與原始物件相同但包含其他連結物件。

1.6 Evolvable連結物件

連結物件在大多數情況下是值物件。因此,允許它們以與PSR-7值物件相同的方式發展是一個有用的選擇。因此,包含了一個額外的EvolvableLinkInterface,它提供了通過單個更改生成新物件例項的方法。 PSR-7使用相同的模型,並且由於PHP的寫時複製行為,仍然是CPU和記憶體效率。

然而,對於模板化沒有可進化的方法,因為連結的模板化值僅基於href值。它不能單獨設定,而是根據href值是否為RFC 6570連結模板得出。

2.包裝

所描述的介面和類是作為psr / link包的一部分提供的。