psx / schema
解析和生成数据架构格式
v6.4.1
2024-09-22 20:59 UTC
Requires
- php: >=8.1
- nikic/php-parser: ^4.0|^5.0
- phpdocumentor/type-resolver: ^1.0
- psr/cache: ^1.0|^2.0|^3.0
- psx/datetime: ^3.0
- psx/http: ^4.0
- psx/json: ^3.0
- psx/record: ^3.0
- psx/uri: ^3.0
- psx/validate: ^2.0
- symfony/cache: ^5.0|^6.0|^7.0
- symfony/console: ^5.0|^6.0|^7.0
Requires (Dev)
- phpunit/phpunit: ^9.0
- symfony/yaml: ^5.0|^6.0|^7.0
- vimeo/psalm: ^5.0
- dev-master
- 6.x-dev
- v6.4.1
- v6.4.0
- v6.3.9
- v6.3.8
- v6.3.7
- v6.3.6
- v6.3.5
- v6.3.4
- v6.3.3
- v6.3.2
- v6.3.1
- v6.3.0
- v6.2.7
- v6.2.6
- v6.2.5
- v6.2.4
- v6.2.3
- v6.2.2
- v6.2.1
- v6.2.0
- v6.1.9
- v6.1.8
- v6.1.7
- v6.1.6
- v6.1.5
- v6.1.4
- v6.1.3
- v6.1.2
- v6.1.1
- v6.1.0
- v6.0.9
- v6.0.8
- v6.0.7
- v6.0.6
- v6.0.5
- v6.0.4
- v6.0.3
- v6.0.2
- v6.0.1
- v6.0.0
- 5.x-dev
- v5.2.1
- v5.2.0
- v5.1.9
- v5.1.8
- v5.1.7
- v5.1.6
- v5.1.5
- v5.1.4
- v5.1.3
- v5.1.2
- v5.1.1
- v5.1.0
- v5.0.9
- v5.0.8
- v5.0.7
- v5.0.6
- v5.0.5
- v5.0.4
- v5.0.3
- v5.0.2
- v5.0.1
- v5.0.0
- 4.x-dev
- v4.2.8
- v4.2.7
- v4.2.6
- v4.2.5
- v4.2.4
- v4.2.3
- v4.2.2
- v4.2.1
- v4.2.0
- v4.1.9
- v4.1.8
- v4.1.7
- v4.1.6
- v4.1.5
- v4.1.4
- v4.1.3
- v4.1.2
- v4.1.1
- v4.1.0
- v4.0.9
- v4.0.8
- v4.0.7
- v4.0.6
- v4.0.5
- v4.0.4
- v4.0.3
- v4.0.2
- v4.0.1
- v4.0.0
- 3.x-dev
- v3.2.4
- v3.2.3
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.7
- v3.1.6
- v3.1.5
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.9
- v3.0.8
- v3.0.7
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v3.0.0-RC9
- v3.0.0-RC8
- v3.0.0-RC7
- v3.0.0-RC6
- v3.0.0-RC5
- v3.0.0-RC4
- v3.0.0-RC3
- v3.0.0-RC2
- v3.0.0-RC1
- 2.x-dev
- v2.6.2
- v2.6.1
- v2.6.0
- v2.5.4
- v2.5.3
- v2.5.2
- v2.5.1
- v2.5.0
- v2.4.4
- v2.4.3
- v2.4.2
- v2.4.1
- v2.4.0
- v2.3.4
- v2.3.3
- v2.3.2
- v2.3.1
- v2.3.0
- v2.2.2
- v2.2.1
- v2.2.0
- v2.1.6
- v2.1.5
- v2.1.4
- v2.1.3
- v2.1.2
- v2.1.1
- v2.1.0
- v2.0.11
- v2.0.10
- v2.0.9
- v2.0.8
- v2.0.7
- v2.0.6
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v0.1.9
- v0.1.8
- v0.1.7
- v0.1.6
- v0.1.5
- v0.1.4
- v0.1.3
- v0.1.2
- v0.1.1
- v0.1.0
This package is auto-updated.
Last update: 2024-09-22 21:00:36 UTC
README
此库可以从JSON文件或使用反射和属性从PHP类解析TypeSchema规范。基于此架构,它可以生成源代码并将原始JSON数据转换为DTO对象。通过这种方式,您可以在API中处理完全类型化的对象,用于入站和出站数据。它基本上提供以下功能:
- 将原始JSON数据转换为DTO对象
- 根据架构生成源代码(例如PHP、TypeScript)
- 根据提供的架构验证数据
用法
首先,我们需要使用TypeSchema规范描述我们的数据格式。然后我们可以根据此规范生成相应的PHP类。
{ "definitions": { "Person": { "type": "object", "properties": { "firstName": { "type": "string" }, "lastName": { "type": "string" }, "age": { "description": "Age in years", "type": "integer", "minimum": 0 } }, "required": [ "firstName", "lastName" ] } }, "$ref": "Person" }
要生成PHP类,我们使用以下命令
vendor/bin/schema schema:parse --format=php schema.json
注意您也可以跳过此步骤,直接自行编写PHP类。从JSON表示开始的优势在于您以中性格式定义了模型,因此可以生成不同环境的模型,例如使用TypeScript生成器为前端生成模型。该命令生成以下源代码
<?php declare(strict_types = 1); #[Required(["firstName", "lastName"])] class Person implements \JsonSerializable { protected ?string $firstName = null; protected ?string $lastName = null; #[Description("Age in years")] #[Minimum(0)] protected ?int $age = null; public function setFirstName(?string $firstName) : void { $this->firstName = $firstName; } public function getFirstName() : ?string { return $this->firstName; } public function setLastName(?string $lastName) : void { $this->lastName = $lastName; } public function getLastName() : ?string { return $this->lastName; } public function setAge(?int $age) : void { $this->age = $age; } public function getAge() : ?int { return $this->age; } public function jsonSerialize() { return (object) array_filter(array('firstName' => $this->firstName, 'lastName' => $this->lastName, 'age' => $this->age), static function ($value) : bool { return $value !== null; }); } }
现在我们可以解析原始JSON数据并将其填充到我们的对象模型中
// the data which we want to import $data = json_decode('{"firstName": "foo", "lastName": "bar"}'); $schemaManager = new SchemaManager(); // we read the schema from the class $schema = $schemaManager->getSchema(Person::class); try { $person = (new SchemaTraverser())->traverse($data, $schema, new TypeVisitor()); // $example contains now an instance of the Person class containing // the firstName and lastName property echo $person->getFirstName(); } catch (\PSX\Schema\Exception\ValidationException $e) { // the validation failed echo $e->getMessage(); }
每个生成的PHP类都实现了JsonSerializable
接口,因此您可以简单地将对象编码为json。
$schema = new Person(); $schema->setFirstName('foo'); $schema->setLastName('bar'); $schema->setAge(12); echo json_encode($schema); // would result in // {"firstName": "foo", "lastName": "bar", "age": 12}
生成器
除了PHP类之外,此库还可以生成以下类型:
- CSharp
- Go
- GraphQL
- HTML
- Java
- JsonSchema
- Kotlin
- Markdown
- PHP
- Protobuf
- Python
- Ruby
- Rust
- Swift
- TypeSchema
- TypeScript
- VisualBasic
属性
以下属性可用: