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