sintese / phancackes
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/sintese/phancackes
Requires
- php: ^7.4
 - ext-json: *
 - justinrainbow/json-schema: ^5.2
 
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.68
 - roave/security-advisories: dev-latest
 
This package is auto-updated.
Last update: 2025-10-16 21:02:12 UTC
README
Case study for Tabulation and Expansion of objects built from a json-schema.
Usage
Given the definition of an object specified by a 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
Our goal is to tabulate its content to simplify manipulation:
echo (new SchemaFlatten())->flat(new SchemaObject($schema));
The tabulated structure will compose key (path) and value (definition) at the same level:
{
  "$.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"
  }
}
Having the tabulated structure in hand, we can create a flattened object to simplify its storage:
$payload = <<<JSON { "$.productId": 1, "$.dimensions.width": 3, "$.dimensions.height": 6, "$.tags[0].name": "tag" } JSON;
This same structure can later be used to recompose the original object:
echo (new SchemaFlatten())->unflat($payload);
Thus assuming the format specified by the JSON schema used as the tabulation basis:
{
  "productId": 1,
  "dimensions": {
    "width": 3,
    "height": 6
  },
  "tags": [
    {
      "name": "tag"
    }
  ]
}
Contributions
Contributions, corrections, and improvement suggestions are very welcome.