55namespace App \Infrastructure \Command ;
66
77use App \Domain \user \Entity \User ;
8+ use AvroSchema ;
89use Doctrine \ORM \EntityManagerInterface ;
10+ use FlixTech \AvroSerializer \Objects \RecordSerializer ;
11+ use FlixTech \SchemaRegistryApi \Registry \Cache \AvroObjectCacheAdapter ;
12+ use FlixTech \SchemaRegistryApi \Registry \CachedRegistry ;
13+ use FlixTech \SchemaRegistryApi \Registry \PromisingRegistry ;
14+ use GuzzleHttp \Client ;
915use Jobcloud \Kafka \Consumer \KafkaConsumerBuilder ;
1016use Jobcloud \Kafka \Exception \KafkaConsumerConsumeException ;
1117use Jobcloud \Kafka \Exception \KafkaConsumerEndOfPartitionException ;
@@ -40,6 +46,22 @@ protected function execute(InputInterface $input, OutputInterface $output): int
4046 {
4147 $ io = new SymfonyStyle ($ input , $ output );
4248
49+
50+ $ schemaRegistryClient = new CachedRegistry (
51+ new PromisingRegistry (
52+ new Client (['base_uri ' => 'schema-registry:8081 ' ])
53+ ),
54+ new AvroObjectCacheAdapter ()
55+ );
56+
57+ $ recordSerializer = new RecordSerializer (
58+ $ schemaRegistryClient ,
59+ [
60+ RecordSerializer::OPTION_REGISTER_MISSING_SCHEMAS => false ,
61+ RecordSerializer::OPTION_REGISTER_MISSING_SUBJECTS => true ,
62+ ]
63+ );
64+
4365 $ consumer = KafkaConsumerBuilder::create ()
4466 ->withAdditionalConfig (
4567 [
@@ -53,16 +75,32 @@ protected function execute(InputInterface $input, OutputInterface $output): int
5375
5476 $ consumer ->subscribe ();
5577
78+ $ schema = <<<'JSON'
79+ {
80+ "type": "record",
81+ "name": "User",
82+ "fields": [
83+ {"name": "name", "type": "string"},
84+ {"name": "surname", "type": "string"},
85+ {"name": "email", "type": "string"}
86+ ]
87+ }
88+ JSON;
89+
90+ $ avroSchema = AvroSchema::parse ($ schema );
91+
5692 while (true ) {
5793 try {
5894 $ message = $ consumer ->consume ();
59- $ userData = json_decode ($ message ->getBody (), true );
60- $ io ->success ('Message received: ' . $ userData ['Name ' ]);
95+
96+ $ userData = $ recordSerializer ->decodeMessage ($ message ->getBody (), $ avroSchema );
97+
98+ $ io ->success ('Message received: ' . $ userData ['name ' ]);
6199
62100 $ user = new User ();
63- $ user ->setName ($ userData ['Name ' ]);
64- $ user ->setSurname ($ userData ['Surname ' ]);
65- $ user ->setEmail ($ userData ['Email ' ]);
101+ $ user ->setName ($ userData ['name ' ]);
102+ $ user ->setSurname ($ userData ['surname ' ]);
103+ $ user ->setEmail ($ userData ['email ' ]);
66104
67105 $ this ->entityManager ->persist ($ user );
68106 $ this ->entityManager ->flush ();
0 commit comments