americanreading / refresolver
解析对象中外部文件的引用
1.0.0
2014-09-17 17:54 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 4.2.*
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;
};
注意事项
没有安全措施来检查循环引用。