From 7985aaa7a524d68e09ea67c8b606069521a16348 Mon Sep 17 00:00:00 2001 From: Evan Burrell Date: Thu, 2 Apr 2026 09:18:42 +0100 Subject: [PATCH 1/2] 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. --- src/SettingsServiceProvider.php | 11 ++++++++ .../ContextSerializers/ContextSerializer.php | 10 ++++++- .../ContextSerializerTest.php | 26 ++++++++++++++++++- .../KeyGenerators/HashKeyGeneratorTest.php | 4 ++- .../KeyGenerators/Md5KeyGeneratorTest.php | 4 ++- .../ReadableKeyGeneratorTest.php | 4 ++- 6 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/SettingsServiceProvider.php b/src/SettingsServiceProvider.php index 2c64fc5..cbc9265 100644 --- a/src/SettingsServiceProvider.php +++ b/src/SettingsServiceProvider.php @@ -32,6 +32,7 @@ public function packageBooted(): void public function packageRegistered(): void { + $this->registerClassAliases(); $this->registerSettings(); } @@ -43,6 +44,16 @@ public function provides(): array ]; } + protected function registerClassAliases(): void + { + if (! class_exists(\Rawilk\Settings\Support\Context::class, false)) { + class_alias( + \AgentSoftware\Settings\Support\Context::class, + 'Rawilk\Settings\Support\Context', + ); + } + } + protected function bootModelBindings(): void { $config = $this->app['config']['settings.drivers.eloquent']; diff --git a/src/Support/ContextSerializers/ContextSerializer.php b/src/Support/ContextSerializers/ContextSerializer.php index 02c176c..24080ad 100644 --- a/src/Support/ContextSerializers/ContextSerializer.php +++ b/src/Support/ContextSerializers/ContextSerializer.php @@ -11,6 +11,14 @@ class ContextSerializer implements ContextSerializerContract { public function serialize(?Context $context = null): string { - return serialize($context); + $serialized = serialize($context); + + // Maintain backward compatibility with the old Rawilk namespace + // so that key generation produces identical keys for existing data. + return str_replace( + sprintf('O:%d:"%s"', strlen('AgentSoftware\\Settings\\Support\\Context'), 'AgentSoftware\\Settings\\Support\\Context'), + sprintf('O:%d:"%s"', strlen('Rawilk\\Settings\\Support\\Context'), 'Rawilk\\Settings\\Support\\Context'), + $serialized, + ); } } diff --git a/tests/Unit/ContextSerializers/ContextSerializerTest.php b/tests/Unit/ContextSerializers/ContextSerializerTest.php index bb61f3a..1be6c0d 100644 --- a/tests/Unit/ContextSerializers/ContextSerializerTest.php +++ b/tests/Unit/ContextSerializers/ContextSerializerTest.php @@ -10,7 +10,10 @@ $serializer = new ContextSerializer; - expect($serializer->serialize($context))->toBe(serialize($context)); + $result = $serializer->serialize($context); + + expect($result)->toContain('Rawilk\Settings\Support\Context') + ->and($result)->not->toContain('AgentSoftware\Settings\Support\Context'); }); it('serializes null values', function () { @@ -18,3 +21,24 @@ expect($serializer->serialize(null))->toBe(serialize(null)); }); + +it('produces output compatible with the old Rawilk namespace for backward compatibility', function () { + $context = (new Context)->set('model', 'App\Models\Website')->set('id', '123'); + + $serializer = new ContextSerializer; + $serialized = $serializer->serialize($context); + + expect($serialized)->toContain('O:31:"Rawilk\Settings\Support\Context"'); +}); + +it('produces output that can be unserialized back to a valid Context', function () { + $context = (new Context)->set('model', 'App\Models\Website')->set('id', '123'); + + $serializer = new ContextSerializer; + $serialized = $serializer->serialize($context); + + $unserialized = unserialize($serialized); + + expect($unserialized)->toBeInstanceOf(Context::class) + ->and($unserialized->toArray())->toBe($context->toArray()); +}); diff --git a/tests/Unit/KeyGenerators/HashKeyGeneratorTest.php b/tests/Unit/KeyGenerators/HashKeyGeneratorTest.php index c42bbc1..ff11c20 100644 --- a/tests/Unit/KeyGenerators/HashKeyGeneratorTest.php +++ b/tests/Unit/KeyGenerators/HashKeyGeneratorTest.php @@ -26,8 +26,10 @@ 'id' => 123, ]); + $serializer = new ContextSerializer; + expect($this->keyGenerator->generate('my-key', $context)) - ->toBe(hash('xxh128', 'my-key' . serialize($context))); + ->toBe(hash('xxh128', 'my-key' . $serializer->serialize($context))); }); it('works with other context serializers', function () { diff --git a/tests/Unit/KeyGenerators/Md5KeyGeneratorTest.php b/tests/Unit/KeyGenerators/Md5KeyGeneratorTest.php index b88b41c..4dd7cee 100644 --- a/tests/Unit/KeyGenerators/Md5KeyGeneratorTest.php +++ b/tests/Unit/KeyGenerators/Md5KeyGeneratorTest.php @@ -22,8 +22,10 @@ 'id' => 123, ]); + $serializer = new ContextSerializer; + expect($this->keyGenerator->generate('my-key', $context)) - ->toBe(md5('my-key' . serialize($context))); + ->toBe(md5('my-key' . $serializer->serialize($context))); }); it('works with other context serializers', function () { diff --git a/tests/Unit/KeyGenerators/ReadableKeyGeneratorTest.php b/tests/Unit/KeyGenerators/ReadableKeyGeneratorTest.php index 9739703..2820387 100644 --- a/tests/Unit/KeyGenerators/ReadableKeyGeneratorTest.php +++ b/tests/Unit/KeyGenerators/ReadableKeyGeneratorTest.php @@ -38,5 +38,7 @@ 'id' => 123, ]); - expect($this->keyGenerator->generate('my-key', $context))->toBe('my-key:c:::' . serialize($context)); + $serializer = new ContextSerializer; + + expect($this->keyGenerator->generate('my-key', $context))->toBe('my-key:c:::' . $serializer->serialize($context)); }); From 2f5941f5b947e01cfdbf61161d9f478f5d958271 Mon Sep 17 00:00:00 2001 From: evan-burrell <44360092+evan-burrell@users.noreply.github.com> Date: Thu, 2 Apr 2026 08:19:01 +0000 Subject: [PATCH 2/2] PHP Linting (Pint) --- src/SettingsServiceProvider.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/SettingsServiceProvider.php b/src/SettingsServiceProvider.php index cbc9265..b94769a 100644 --- a/src/SettingsServiceProvider.php +++ b/src/SettingsServiceProvider.php @@ -9,6 +9,7 @@ use AgentSoftware\Settings\Support\ContextSerializers\ContextSerializer; use AgentSoftware\Settings\Support\KeyGenerators\Md5KeyGenerator; use AgentSoftware\Settings\Support\ValueSerializers\ValueSerializer; +use Rawilk\Settings\Support\Context; use Spatie\LaravelPackageTools\Package; use Spatie\LaravelPackageTools\PackageServiceProvider; @@ -46,9 +47,9 @@ public function provides(): array protected function registerClassAliases(): void { - if (! class_exists(\Rawilk\Settings\Support\Context::class, false)) { + if (! class_exists(Context::class, false)) { class_alias( - \AgentSoftware\Settings\Support\Context::class, + Support\Context::class, 'Rawilk\Settings\Support\Context', ); }