项目作者: php-kafka

项目描述 :
PHP avro subschema merger and experimental PHP Class avro schema generator
高级语言: PHP
项目地址: git://github.com/php-kafka/php-avro-schema-generator.git
创建时间: 2020-09-26T16:10:21Z
项目社区:https://github.com/php-kafka/php-avro-schema-generator

开源协议:MIT License

下载


Avro schema generator for PHP

Actions Status
Maintainability
Test Coverage
Supported PHP versions: ^8.2
Latest Stable Version

Installation

  1. composer require php-kafka/php-avro-schema-generator "^3.0"

Note: For PHP7.x please use the 2.x version.

Description

This library enables you to:

  • Manage your embedded schema as separate files
  • The library is able to merge those files
  • The library is able to generate avsc schema templates from PHP classes

Merging subschemas / schemas

Schema template directories: directories containing avsc template files (with subschema)
Output directory: output directory for the merged schema files

Console example

  1. ./vendor/bin/avro-cli avro:subschema:merge ./example/schemaTemplates ./example/schema

PHP example

  1. <?php
  2. use PhpKafka\PhpAvroSchemaGenerator\Registry\SchemaRegistry;
  3. use PhpKafka\PhpAvroSchemaGenerator\Merger\SchemaMerger;
  4. $registry = (new SchemaRegistry())
  5. ->addSchemaTemplateDirectory('./schemaTemplates')
  6. ->load();
  7. $merger = new SchemaMerger('./schema');
  8. $merger->setSchemaRegistry($registry);
  9. $merger->merge();

Merge optimizers

There are optimizers that you can enable for merging schema:

  • FullNameOptimizer: removes unneeded namespaces
  • FieldOrderOptimizer: the first fields of a record schema will be: type, name, namespace (if present)
  • PrimitiveSchemaOptimizer: Optimizes primitive schema e.g. {"type": "string"} to "string"

How to enable optimizer:

Console example

  1. ./bin/avro-cli --optimizeFullNames --optimizeFieldOrder --optimizePrimitiveSchemas avro:subschema:merge ./example/schemaTemplates ./example/schema

PHP Example

  1. <?php
  2. use PhpKafka\PhpAvroSchemaGenerator\Registry\SchemaRegistry;
  3. use PhpKafka\PhpAvroSchemaGenerator\Merger\SchemaMerger;
  4. use PhpKafka\PhpAvroSchemaGenerator\Optimizer\FieldOrderOptimizer;
  5. use PhpKafka\PhpAvroSchemaGenerator\Optimizer\FullNameOptimizer;
  6. use PhpKafka\PhpAvroSchemaGenerator\Optimizer\PrimitiveSchemaOptimizer;
  7. $registry = (new SchemaRegistry())
  8. ->addSchemaTemplateDirectory('./schemaTemplates')
  9. ->load();
  10. $merger = new SchemaMerger('./schema');
  11. $merger->setSchemaRegistry($registry);
  12. $merger->addOptimizer(new FieldOrderOptimizer());
  13. $merger->addOptimizer(new FullNameOptimizer());
  14. $merger->addOptimizer(new PrimitiveSchemaOptimizer());
  15. $merger->merge();

Generating schemas from classes

You will need to adjust the generated templates, but it gives you a good starting point to work with.
Class directories: Directories containing the classes you want to generate schemas from
Output directory: output directory for your generated schema templates
After you have reviewed and adjusted your templates you will need to merge them (see above)

Console example

  1. ./bin/avro-cli avro:schema:generate ./example/classes ./example/schemaTemplates

PHP Example

  1. <?php
  2. use PhpKafka\PhpAvroSchemaGenerator\Converter\PhpClassConverter;
  3. use PhpKafka\PhpAvroSchemaGenerator\Parser\ClassParser;
  4. use PhpKafka\PhpAvroSchemaGenerator\Parser\DocCommentParser;
  5. use PhpKafka\PhpAvroSchemaGenerator\Registry\ClassRegistry;
  6. use PhpKafka\PhpAvroSchemaGenerator\Parser\ClassPropertyParser;
  7. use PhpKafka\PhpAvroSchemaGenerator\Generator\SchemaGenerator;
  8. use PhpParser\ParserFactory;
  9. $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7);
  10. $classPropertyParser = new ClassPropertyParser(new DocCommentParser());
  11. $classParser = new ClassParser($parser, $classPropertyParser);
  12. $converter = new PhpClassConverter($classParser);
  13. $registry = (new ClassRegistry($converter))->addClassDirectory('./classes')->load();
  14. $generator = new SchemaGenerator('./schema');
  15. $generator->setClassRegistry($registry);
  16. $schemas = $generator->generate();
  17. $generator->exportSchemas($schemas);

The generator is able to detect types from:

  • doc comments
  • property types
  • doc annotations
    • @avro-type to set a fixed type instead of calculating one
    • @avro-default set a default for this property in your schema
    • @avro-doc to set schema doc comment
    • @avro-logical-type set logical type for your property (decimal is not yet supported, since it has additional parameters)

Disclaimer

In v1.3.0 the option --optimizeSubSchemaNamespaces was added. It was not working fully
in the 1.x version and we had some discussions (#13) about it.
Ultimately the decision was to adapt this behaviour fully in v2.0.0 so you might want to
upgrade if you rely on that behaviour.