koco / avro-regy
Symfony Messenger Avro Schema Registry Bundle
v1.2.0
2022-10-27 14:44 UTC
Requires
- php: ^7.4|8.*
- flix-tech/avro-serde-php: ^2.0
- symfony/framework-bundle: ^5.4||^6.0
- symfony/messenger: ^5.4||^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- matthiasnoback/symfony-config-test: ^4.2
- phpstan/phpstan: ^0.12.52
- symfony/phpunit-bridge: ^5.4||^6.0
Suggests
- koco/messenger-kafka: Out of the box Kafka transport
README
此包提供了一种简单的方法将 Symfony Messenger 与 Confluent Schema Registry 集成。
安装
使用 Symfony Flex 的应用程序
打开命令行,进入您的项目目录并执行
$ composer require koco/avro-regy
不使用 Symfony Flex 的应用程序
添加 composer 依赖项后,通过将其添加到项目 config/bundles.php
文件中注册的包列表来启用包
return [ // ... Koco\AvroRegy\AvroRegyBundle::class => ['all' => true], ];
配置
创建 config/avro_regy.yaml
并配置如下示例
avro_regy: base_uri: '%env(SCHEMA_REGISTRY_URL)%' file_naming_strategy: subject options: register_missing_schemas: true register_missing_subjects: true serializers: catalogue: schema_dir: '%kernel.project_dir%/src/Catalogue/Domain/Model/Event/Avro/' orders: schema_dir: '%kernel.project_dir%/src/Orders/Domain/Model/Event/Avro/'
您配置的每个序列化器都将作为其自身的服务可用。服务 ID 为 avro_regy.serializer.<name>
。在 config/messenger.yaml
中可以这样调用
framework: messenger: transports: catalogue: dsn: '%env(MESSENGER_TRANSPORT_CATALOGUE_KAFKA_DSN)%' serializer: avro_regy.serializer.catalogue options: ...
然后,按如下方式编写您的序列化器
namespace App\Catalogue\Infrastructure\Messenger\Serializer; use App\Catalogue\Domain\Model\Event\ProductCreated; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; class ProductCreatedSerializer implements SerializerInterface { public function decode(array $encodedEnvelope): Envelope { $record = $encodedEnvelope['body']; return new Envelope(new ProductCreated( $record['id'], $record['name'], $record['description'], )); } public function encode(Envelope $envelope): array { /** @var ProductCreated $event */ $event = $envelope->getMessage(); return [ 'key' => $event->getId(), 'headers' => [], 'body' => [ 'id' => $event->getId(), 'name' => $event->getName(), 'description' => $event->getDescription(), ], ]; } }
并标记它
App\Catalogue\Infrastructure\Messenger\Serializer\ProductCreatedSerializer: tags: - { name: 'avro_regy.serializer.catalogue', qualified_name: 'com.Example.Catalogue.ProductCreated', class_name: 'App\Catalogue\Domain\Model\Event\ProductCreated', key_subject: 'catalogue.product_created-key', value_subject: 'catalogue.product_created-value' }