php-kafka / php-avro-schema-generator
用于子模式的 PHP Avro schema 生成器
v3.0.0-beta2
2023-11-24 10:08 UTC
Requires
- ext-json: *
- flix-tech/avro-php: ^3.0|^4.0|^5.0
- nikic/php-parser: ^4.13
- pimple/pimple: ^3.5
- symfony/console: ^4.3|^5.1|^6.0
Requires (Dev)
- composer/xdebug-handler: ^2.0|^3.0
- friendsofphp/php-cs-fixer: ^2.19|^3.15
- infection/infection: ^0.25|^0.27
- phpstan/phpstan: ^1.2
- phpunit/phpunit: ^9.3
- rregeer/phpunit-coverage-check: ^0.3
- squizlabs/php_codesniffer: ^3.4.2
This package is auto-updated.
Last update: 2024-09-24 11:58:46 UTC
README
安装
composer require php-kafka/php-avro-schema-generator "^3.0"
描述
这个库允许你
- 将你的嵌入式模式作为独立的文件管理
- 库能够合并这些文件
- 库能够从 PHP 类生成 avsc 模板
合并子模式/模式
模式模板目录:包含 avsc 模板文件(包含子模式)的目录
输出目录:合并的 schema 文件输出目录
控制台示例
./vendor/bin/avro-cli avro:subschema:merge ./example/schemaTemplates ./example/schema
PHP 示例
<?php use PhpKafka\PhpAvroSchemaGenerator\Registry\SchemaRegistry; use PhpKafka\PhpAvroSchemaGenerator\Merger\SchemaMerger; $registry = (new SchemaRegistry()) ->addSchemaTemplateDirectory('./schemaTemplates') ->load(); $merger = new SchemaMerger('./schema'); $merger->setSchemaRegistry($registry); $merger->merge();
合并优化器
有一些优化器可以在合并模式时启用
- FullNameOptimizer:移除不必要的命名空间
- FieldOrderOptimizer:记录模式中的第一个字段将是:类型、名称、命名空间(如果有)
- PrimitiveSchemaOptimizer:优化原始模式,例如
{"type": "string"}
优化为"string"
如何启用优化器
控制台示例
./vendor/bin/avro-cli --optimizeFullNames --optimizeFieldOrder --optimizePrimitiveSchemas avro:subschema:merge ./example/schemaTemplates ./example/schema
PHP 示例
<?php use PhpKafka\PhpAvroSchemaGenerator\Registry\SchemaRegistry; use PhpKafka\PhpAvroSchemaGenerator\Merger\SchemaMerger; use PhpKafka\PhpAvroSchemaGenerator\Optimizer\FieldOrderOptimizer; use PhpKafka\PhpAvroSchemaGenerator\Optimizer\FullNameOptimizer; use PhpKafka\PhpAvroSchemaGenerator\Optimizer\PrimitiveSchemaOptimizer; $registry = (new SchemaRegistry()) ->addSchemaTemplateDirectory('./schemaTemplates') ->load(); $merger = new SchemaMerger('./schema'); $merger->setSchemaRegistry($registry); $merger->addOptimizer(new FieldOrderOptimizer()); $merger->addOptimizer(new FullNameOptimizer()); $merger->addOptimizer(new PrimitiveSchemaOptimizer()); $merger->merge();
从类生成模式
你需要调整生成的模板,但它为你提供了一个良好的起点。
类目录:包含你想要从中生成模式的类的目录
输出目录:生成模式模板的输出目录
在您审查和调整模板后,您需要合并它们(见上文)
控制台示例
./vendor/bin/avro-cli avro:schema:generate ./example/classes ./example/schemaTemplates
PHP 示例
<?php use PhpKafka\PhpAvroSchemaGenerator\Converter\PhpClassConverter; use PhpKafka\PhpAvroSchemaGenerator\Parser\ClassParser; use PhpKafka\PhpAvroSchemaGenerator\Parser\DocCommentParser; use PhpKafka\PhpAvroSchemaGenerator\Registry\ClassRegistry; use PhpKafka\PhpAvroSchemaGenerator\Parser\ClassPropertyParser; use PhpKafka\PhpAvroSchemaGenerator\Generator\SchemaGenerator; use PhpParser\ParserFactory; $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7); $classPropertyParser = new ClassPropertyParser(new DocCommentParser()); $classParser = new ClassParser($parser, $classPropertyParser); $converter = new PhpClassConverter($classParser); $registry = (new ClassRegistry($converter))->addClassDirectory('./classes')->load(); $generator = new SchemaGenerator('./schema'); $generator->setClassRegistry($registry); $schemas = $generator->generate(); $generator->exportSchemas($schemas);
生成器能够从以下内容检测类型:
- 文档注释
- 属性类型
- 文档注释
- @avro-type 设置固定类型而不是计算类型
- @avro-default 在您的模式中为该属性设置默认值
- @avro-doc 设置模式文档注释
- @avro-logical-type 为您的属性设置逻辑类型(decimal 由于具有附加参数尚未支持)
免责声明
在 v1.3.0
中添加了选项 --optimizeSubSchemaNamespaces
。它在 1.x
版本中并未完全工作
并且我们关于这一点有一些讨论(#13)。
最终的决定是在 v2.0.0
中完全适应这种行为,因此如果您依赖这种行为,您可能需要
升级。