rwos/schematic

此包已被 弃用 且不再维护。未建议替代包。

从 JSON 模式生成 POPO

0.6.0 2018-09-02 19:33 UTC

This package is auto-updated.

Last update: 2020-01-29 14:18:46 UTC


README

Latest Stable Version License Build Status Code Coverage Scrutinizer Code Quality

此项目未维护。

Schematic 是一个 JSON 模式 解析器,同时也支持生成纯旧 PHP 对象 (POPO) 代码。这些生成的模型可以作为领域实体的起点,或者简单地提供 JSON 请求体的额外结构。

力求符合 PSR-1PSR-2PSR-4 规范。

安装

composer require rwos/schematic

示例

example/ 目录中包含了一些示例。

模式解析

给定以下 car.json 中的模式

{
    "type": "object",
    "properties": {
        "make": {
            "type": "string"
        },
        "model": {
            "type": "string"
        },
        "year": {
            "type": "integer"
        },
        "owners": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "isCurrentOwner": {
                        "type": "boolean"
                    }
                },
                "required": ["name"]
            }
        }
    },
    "required": ["make", "model"]
}

首先需要解析该模式

use RoundingWell\Schematic\Schema;

$schema = Schema::fromFile('car.json');

assert($schema->isObject());

当模式是对象时,可以访问其属性

$properties = $schema->properties();

assert(is_array($properties));
assert(isset($properties['make']));
assert(isset($properties['owners']));

并且可以检查所需的属性

assert($schema->isRequired('make'));
assert($schema->isRequired('year') === false);

数组项提供了有关内容的其他详细信息

$items = $properties['owners']->items();

assert($items->isObject());

代码生成

生成的类是从模式生成的非常基础的纯 PHP 对象。

use RoundingWell\Schematic\Generator;

$generator = new Generator();

生成器可以从对象模式创建一个 AST,以及为对象属性创建的附加类。

$classes = $generator->generate($schema, 'Acme\Model\Car', 'Acme\Model');

这将创建一个扩展 Acme\ModelAcme\Model\Car 类。模式中的任何对象属性也将被创建。一旦生成类,就可以将它们写入目录

$files = $generator->write($classes, 'src/');

编写器将把 AST 转换为代码,写入 src/,并返回创建的文件。

完整示例

将所有这些放在一起,以下是一个代码生成的完整示例

use RoundingWell\Schematic\Generator;
use RoundingWell\Schematic\Schema;

$generator = new Generator();
$schema = Schema::fromFile('car.json');
$classes = $generator->generate($schema);
$files = $generator->write($classes, 'src/', 'Acme\Model');

注意:传递给 write() 的最后一个参数是您项目的 PSR-4 命名空间。如果提供,则将从文件路径中删除此命名空间。

src/Car.php 的源代码将是

<?php

namespace Acme\Model;

class Car
{
    /**
     * @var string
     */
    public $vin;
    /**
     * @var string|null
     */
    public $make;
    /**
     * @var string|null
     */
    public $model;
    /**
     * @var int|null
     */
    public $year;
    /**
     * @var \Acme\Model\Car\Owner[]
     */
    public $owners;
}

src/Car/Owner.php 的源代码将是

<?php

namespace Acme\Model\Car;

class Owner
{
    /**
     * @var string
     */
    public $name;
    /**
     * @var bool|null
     */
    public $isCurrentOwner;
}

建议

Schematic 生成的模型不包含从 JSON 中填充模型的功能。我们建议使用 JsonMapper 或类似的水化器。

许可证

Apache 2.0