php-kafka/php-avro-schema-generator

用于子模式的 PHP Avro schema 生成器

v3.0.0-beta2 2023-11-24 10:08 UTC

README

Actions Status Maintainability Test Coverage Supported PHP versions: 7.4 .. 8.x Latest Stable Version

安装

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 中完全适应这种行为,因此如果您依赖这种行为,您可能需要
升级。