PHP avro subschema merger and experimental PHP Class avro schema generator
composer require php-kafka/php-avro-schema-generator "^3.0"
Note: For PHP7.x please use the 2.x version.
This library enables you to:
Schema template directories: directories containing avsc template files (with subschema)
Output directory: output directory for the merged schema files
Console example
./vendor/bin/avro-cli avro:subschema:merge ./example/schemaTemplates ./example/schema
PHP example
<?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();
There are optimizers that you can enable for merging schema:
{"type": "string"}
to "string"
How to enable optimizer:
Console example
./bin/avro-cli --optimizeFullNames --optimizeFieldOrder --optimizePrimitiveSchemas avro:subschema:merge ./example/schemaTemplates ./example/schema
PHP Example
<?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();
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
./bin/avro-cli avro:schema:generate ./example/classes ./example/schemaTemplates
PHP Example
<?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);
The generator is able to detect types from:
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.