diff --git a/src/SettingsServiceProvider.php b/src/SettingsServiceProvider.php index 2c64fc5..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; @@ -32,6 +33,7 @@ public function packageBooted(): void public function packageRegistered(): void { + $this->registerClassAliases(); $this->registerSettings(); } @@ -43,6 +45,16 @@ public function provides(): array ]; } + protected function registerClassAliases(): void + { + if (! class_exists(Context::class, false)) { + class_alias( + 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)); });