Estudo de caso para Tabulação e Expansão de objetos construídos a partir de um json-schema.
Dado a definição de um objeto especificada por um json-schema:
$schema = <<<JSON
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/product.schema.json",
"title": "Product",
"description": "A product from Acme's catalog",
"type": "object",
"properties": {
"productId": {
"description": "The unique identifier for a product",
"type": "integer"
},
"dimensions": {
"type": "object",
"properties": {
"width": {
"type": "number"
},
"height": {
"type": "number"
}
}
},
"tags": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
}
}
}
}
JSON
Temos por objetivo realizar a tabulação de seu conteúdo visando simplificar a sua manipulação:
echo (new SchemaFlatten())->flat(new SchemaObject($schema));
A estrutura tabulada irá compor em um mesmo nível chave (caminho) e valor (definição):
{
"$.productId": {
"description": "The unique identifier for a product",
"type": "integer",
"path": "$.productId",
"prop": "productId"
},
"$.dimensions.width": {
"type": "number",
"path": "$.dimensions.width",
"prop": "width"
},
"$.dimensions.height": {
"type": "number",
"path": "$.dimensions.height",
"prop": "height"
},
"$.tags[0].name": {
"type": "string",
"path": "$.tags[0].name",
"prop": "name"
}
}
Tendo a estrutura tabulada em mãos podemos criar um objeto achatado simplificando seu armazenamento:
$payload = <<<JSON
{
"$.productId": 1,
"$.dimensions.width": 3,
"$.dimensions.height": 6,
"$.tags[0].name": "tag"
}
JSON;
Essa mesma estrutura pode ser utilizada em um segundo momento para recompor o objeto original:
echo (new SchemaFlatten())->unflat($payload);
Assumindo assim o formato especificado pelo json schema utilizado como base de tabulação:
{
"productId": 1,
"dimensions": {
"width": 3,
"height": 6
},
"tags": [
{
"name": "tag"
}
]
}
Contribuições, correções e sugestões de melhoria são muito bem-vindas.