americanreading/refresolver

解析对象中外部文件的引用

1.0.0 2014-09-17 17:54 UTC

This package is not auto-updated.

Last update: 2024-09-24 07:17:05 UTC


README

使用 RefResolver 解析引用或“扁平化”对象。

RefResolver 可以与任何对象一起工作,但最有可能在处理 JSON 时有用,尤其是 JSON Schema 文档和 Swagger 配置文件。

引用

引用的格式遵循 JSON Schema 使用的语法。然而,对引用在结构内部的位置没有限制。

要创建一个引用,在一个对象上包含一个指向描述对象的文件路径的 $ref 属性。该路径可以是本地文件路径或 HTTP URI。

示例

给定这个文件:http://www.myjsonfile/cats.json

{
    "cats": [
        {
            "name": "Molly",
            "color": "Calico"
        },
        {
            "name": "Oscar",
            "color": "Orange"
        }
    ]
}

我们可以在另一个 JSON 结构中包含对这个文件的引用。

<?php
$json = <<<JSON
{
    "dog": "Bear",
    "\$ref": "http://www.myjsonfile/cats.json"
}
JSON

$obj = json_decode($json);

$resolver new RefResolver();
$resolver->resolve($obj);

调用 $resolver->resolve($obj) 后,$obj 将包含一个“扁平化”的结构,将 http://www.myjsonfile/cats.json 的内容转换为对象并附加到 $obj 上。

$obj 现在将看起来像这样(显示为格式化好的 JSON)

{
    "dog": "Bear",
    "cats": [
        {
            "name": "Molly",
            "color": "Calico"
        },
        {
            "name": "Oscar",
            "color": "Orange"
        }
    ]
}

自定义解析器函数

默认情况下,RefResolver 实例将获取 $ref 属性的值,将其传递给 file_get_contents,然后将其传递给 json_decode,并扩展解码后的对象。

您可以通过向构造函数传递可调用来自定义此行为。该可调用必须期望将 $ref 属性的值作为参数,并返回一个对象或 null。

要解析引用内容为 XML 而不是 JSON,您可以使用如下自定义函数

<?php
$resolverFn = function ($ref) {
    $contents = @file_get_contents($ref);
    if ($contents) {
        return simplexml_load_string($contents);
    }
    return null;
};

注意事项

没有安全措施来检查循环引用。