Skip to content

Commit 5559723

Browse files
committed
Add fallback to JsonSerializer in configureSerializer
- Ensures robustness by providing a default serializer - Refactoring
1 parent af27b52 commit 5559723

File tree

2 files changed

+62
-33
lines changed

2 files changed

+62
-33
lines changed

pkg/rdkafka/RdKafkaContext.php

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Interop\Queue\Queue;
1717
use Interop\Queue\SubscriptionConsumer;
1818
use Interop\Queue\Topic;
19-
use InvalidArgumentException;
2019
use RdKafka\Conf;
2120
use RdKafka\KafkaConsumer;
2221
use RdKafka\Producer as VendorProducer;
@@ -58,34 +57,6 @@ public function __construct(array $config)
5857
$this->configureSerializer($config);
5958
}
6059

61-
/**
62-
* @param array $config
63-
* @return void
64-
*/
65-
private function configureSerializer(array $config): void
66-
{
67-
if (!isset($config['serializer'])) {
68-
$this->setSerializer(new JsonSerializer());
69-
return;
70-
}
71-
72-
if (is_string($config['serializer'])) {
73-
$this->setSerializer(new $config['serializer']());
74-
} elseif (is_array($config['serializer']) && isset($config['serializer']['class'])) {
75-
$serializerClass = $config['serializer']['class'];
76-
$serializerOptions = $config['serializer']['options'] ?? [];
77-
if (!empty($serializerOptions)) {
78-
$this->setSerializer(new $serializerClass($serializerOptions));
79-
} else {
80-
$this->setSerializer(new $serializerClass());
81-
}
82-
} elseif ($config['serializer'] instanceof Serializer) {
83-
$this->setSerializer($config['serializer']);
84-
} else {
85-
throw new InvalidArgumentException('Invalid serializer configuration');
86-
}
87-
}
88-
8960
/**
9061
* @return RdKafkaMessage
9162
*/
@@ -208,6 +179,58 @@ public static function getLibrdKafkaVersion(): string
208179
return "$major.$minor.$patch";
209180
}
210181

182+
/**
183+
* @return void
184+
* JsonSerializer should be the default fallback if no serializer is specified
185+
*/
186+
private function configureSerializer(array $config): void
187+
{
188+
if (!isset($config['serializer'])) {
189+
$this->setSerializer(new JsonSerializer());
190+
191+
return;
192+
}
193+
194+
$serializer = $config['serializer'];
195+
196+
if ($serializer instanceof Serializer) {
197+
$this->setSerializer($serializer);
198+
199+
return;
200+
}
201+
202+
$serializerClass = $this->resolveSerializerClass($serializer);
203+
204+
if (!class_exists($serializerClass) || !is_a($serializerClass, Serializer::class, true)) {
205+
throw $this->createInvalidSerializerException($serializerClass);
206+
}
207+
208+
$serializerOptions = $serializer['options'] ?? [];
209+
$this->setSerializer(new $serializerClass($serializerOptions));
210+
}
211+
212+
private function resolveSerializerClass(mixed $serializer): string
213+
{
214+
if (is_string($serializer)) {
215+
return $serializer;
216+
}
217+
218+
if (is_array($serializer) && isset($serializer['class'])) {
219+
return $serializer['class'];
220+
}
221+
222+
throw $this->createInvalidSerializerException($serializer);
223+
}
224+
225+
private function createInvalidSerializerException(mixed $value): \InvalidArgumentException
226+
{
227+
return new \InvalidArgumentException(sprintf(
228+
'Invalid serializer configuration. Expected "serializer" to be a string, an array with a "class" key, or a %s instance. Received %s instead.',
229+
Serializer::class,
230+
get_debug_type($value)
231+
));
232+
}
233+
211234
private function getConf(): Conf
212235
{
213236
if (null === $this->conf) {

pkg/rdkafka/Tests/RdKafkaContextTest.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Enqueue\RdKafka\Serializer;
99
use Interop\Queue\Exception\InvalidDestinationException;
1010
use Interop\Queue\Exception\TemporaryQueueNotSupportedException;
11-
use InvalidArgumentException;
1211
use PHPUnit\Framework\TestCase;
1312

1413
class RdKafkaContextTest extends TestCase
@@ -42,19 +41,26 @@ public function testShouldUseStringSerializerClassFromConfig()
4241
$mockSerializerClass = get_class($this->createMock(Serializer::class));
4342

4443
$context = new RdKafkaContext([
45-
'serializer' => $mockSerializerClass
44+
'serializer' => $mockSerializerClass,
4645
]);
4746

4847
$this->assertInstanceOf($mockSerializerClass, $context->getSerializer());
4948
}
5049

50+
public function testShouldUseJsonSerializer()
51+
{
52+
$context = new RdKafkaContext([]);
53+
54+
$this->assertInstanceOf(JsonSerializer::class, $context->getSerializer());
55+
}
56+
5157
public function testShouldThrowExceptionOnInvalidSerializerConfig()
5258
{
53-
$this->expectException(InvalidArgumentException::class);
59+
$this->expectException(\InvalidArgumentException::class);
5460
$this->expectExceptionMessage('Invalid serializer configuration');
5561

5662
new RdKafkaContext([
57-
'serializer' => 123
63+
'serializer' => 123,
5864
]);
5965
}
6066

0 commit comments

Comments
 (0)