rwos / schematic
此包已被 弃用 且不再维护。未建议替代包。
从 JSON 模式生成 POPO
0.6.0
2018-09-02 19:33 UTC
Requires
- php: >=7.1
- ext-json: *
- doctrine/inflector: ^1.1
- nikic/php-parser: ^4.0
Requires (Dev)
- eloquent/liberator: ^2.0
- eloquent/phony-phpunit: ^4.0
- phpunit/phpunit: ^7.1
README
此项目未维护。
Schematic 是一个 JSON 模式 解析器,同时也支持生成纯旧 PHP 对象 (POPO) 代码。这些生成的模型可以作为领域实体的起点,或者简单地提供 JSON 请求体的额外结构。
安装
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\Model 的 Acme\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