An open API service indexing awesome lists of open source software.

https://github.com/php-kafka/php-avro-schema-generator

PHP avro subschema merger and experimental PHP Class avro schema generator
https://github.com/php-kafka/php-avro-schema-generator

avro avro-schema php schema sub subschema

Last synced: about 1 month ago
JSON representation

PHP avro subschema merger and experimental PHP Class avro schema generator

Awesome Lists containing this project

README

          

# Avro schema generator for PHP
[![Actions Status](https://github.com/php-kafka/php-avro-schema-generator/workflows/CI/badge.svg)](https://github.com/php-kafka/php-avro-schema-generator/workflows/CI/badge.svg)
[![Maintainability](https://api.codeclimate.com/v1/badges/41aecf21566d7e9bfb69/maintainability)](https://codeclimate.com/github/php-kafka/php-avro-schema-generator/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/41aecf21566d7e9bfb69/test_coverage)](https://codeclimate.com/github/php-kafka/php-avro-schema-generator/test_coverage)
![Supported PHP versions: ^8.2](https://img.shields.io/badge/php-%5E8.2-blue.svg)
[![Latest Stable Version](https://poser.pugx.org/php-kafka/php-avro-schema-generator/v/stable)](https://packagist.org/packages/php-kafka/php-avro-schema-generator)

## Installation
```
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**
```bash
./vendor/bin/avro-cli avro:subschema:merge ./example/schemaTemplates ./example/schema
```

**PHP example**
```php
addSchemaTemplateDirectory('./schemaTemplates')
->load();

$merger = new SchemaMerger('./schema');
$merger->setSchemaRegistry($registry);

$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**
```bash
./bin/avro-cli --optimizeFullNames --optimizeFieldOrder --optimizePrimitiveSchemas avro:subschema:merge ./example/schemaTemplates ./example/schema
```
**PHP Example**
```php
addSchemaTemplateDirectory('./schemaTemplates')
->load();

$merger = new SchemaMerger('./schema');
$merger->setSchemaRegistry($registry);
$merger->addOptimizer(new FieldOrderOptimizer());
$merger->addOptimizer(new FullNameOptimizer());
$merger->addOptimizer(new PrimitiveSchemaOptimizer());

$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**
```bash
./bin/avro-cli avro:schema:generate ./example/classes ./example/schemaTemplates
```

**PHP Example**
```php
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:
- 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](https://github.com/php-kafka/php-avro-schema-generator/issues/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.