Skip to content

Commit 7985aaa

Browse files
committed
Fix backward compatibility for settings keys created under old Rawilk namespace
The package rebrand from Rawilk to AgentSoftware changed the FQCN embedded in serialized Context objects, breaking key lookup for existing database entries. The ContextSerializer now normalizes its output to use the old namespace, and a class alias is registered so old serialized data can still be unserialized.
1 parent e5769d8 commit 7985aaa

6 files changed

Lines changed: 54 additions & 5 deletions

File tree

src/SettingsServiceProvider.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public function packageBooted(): void
3232

3333
public function packageRegistered(): void
3434
{
35+
$this->registerClassAliases();
3536
$this->registerSettings();
3637
}
3738

@@ -43,6 +44,16 @@ public function provides(): array
4344
];
4445
}
4546

47+
protected function registerClassAliases(): void
48+
{
49+
if (! class_exists(\Rawilk\Settings\Support\Context::class, false)) {
50+
class_alias(
51+
\AgentSoftware\Settings\Support\Context::class,
52+
'Rawilk\Settings\Support\Context',
53+
);
54+
}
55+
}
56+
4657
protected function bootModelBindings(): void
4758
{
4859
$config = $this->app['config']['settings.drivers.eloquent'];

src/Support/ContextSerializers/ContextSerializer.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ class ContextSerializer implements ContextSerializerContract
1111
{
1212
public function serialize(?Context $context = null): string
1313
{
14-
return serialize($context);
14+
$serialized = serialize($context);
15+
16+
// Maintain backward compatibility with the old Rawilk namespace
17+
// so that key generation produces identical keys for existing data.
18+
return str_replace(
19+
sprintf('O:%d:"%s"', strlen('AgentSoftware\\Settings\\Support\\Context'), 'AgentSoftware\\Settings\\Support\\Context'),
20+
sprintf('O:%d:"%s"', strlen('Rawilk\\Settings\\Support\\Context'), 'Rawilk\\Settings\\Support\\Context'),
21+
$serialized,
22+
);
1523
}
1624
}

tests/Unit/ContextSerializers/ContextSerializerTest.php

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,35 @@
1010

1111
$serializer = new ContextSerializer;
1212

13-
expect($serializer->serialize($context))->toBe(serialize($context));
13+
$result = $serializer->serialize($context);
14+
15+
expect($result)->toContain('Rawilk\Settings\Support\Context')
16+
->and($result)->not->toContain('AgentSoftware\Settings\Support\Context');
1417
});
1518

1619
it('serializes null values', function () {
1720
$serializer = new ContextSerializer;
1821

1922
expect($serializer->serialize(null))->toBe(serialize(null));
2023
});
24+
25+
it('produces output compatible with the old Rawilk namespace for backward compatibility', function () {
26+
$context = (new Context)->set('model', 'App\Models\Website')->set('id', '123');
27+
28+
$serializer = new ContextSerializer;
29+
$serialized = $serializer->serialize($context);
30+
31+
expect($serialized)->toContain('O:31:"Rawilk\Settings\Support\Context"');
32+
});
33+
34+
it('produces output that can be unserialized back to a valid Context', function () {
35+
$context = (new Context)->set('model', 'App\Models\Website')->set('id', '123');
36+
37+
$serializer = new ContextSerializer;
38+
$serialized = $serializer->serialize($context);
39+
40+
$unserialized = unserialize($serialized);
41+
42+
expect($unserialized)->toBeInstanceOf(Context::class)
43+
->and($unserialized->toArray())->toBe($context->toArray());
44+
});

tests/Unit/KeyGenerators/HashKeyGeneratorTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
'id' => 123,
2727
]);
2828

29+
$serializer = new ContextSerializer;
30+
2931
expect($this->keyGenerator->generate('my-key', $context))
30-
->toBe(hash('xxh128', 'my-key' . serialize($context)));
32+
->toBe(hash('xxh128', 'my-key' . $serializer->serialize($context)));
3133
});
3234

3335
it('works with other context serializers', function () {

tests/Unit/KeyGenerators/Md5KeyGeneratorTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
'id' => 123,
2323
]);
2424

25+
$serializer = new ContextSerializer;
26+
2527
expect($this->keyGenerator->generate('my-key', $context))
26-
->toBe(md5('my-key' . serialize($context)));
28+
->toBe(md5('my-key' . $serializer->serialize($context)));
2729
});
2830

2931
it('works with other context serializers', function () {

tests/Unit/KeyGenerators/ReadableKeyGeneratorTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,7 @@
3838
'id' => 123,
3939
]);
4040

41-
expect($this->keyGenerator->generate('my-key', $context))->toBe('my-key:c:::' . serialize($context));
41+
$serializer = new ContextSerializer;
42+
43+
expect($this->keyGenerator->generate('my-key', $context))->toBe('my-key:c:::' . $serializer->serialize($context));
4244
});

0 commit comments

Comments
 (0)