diff --git a/src/Url/MetadataUrlTransformer.php b/src/Url/MetadataUrlTransformer.php index 89ea04a..9142c14 100644 --- a/src/Url/MetadataUrlTransformer.php +++ b/src/Url/MetadataUrlTransformer.php @@ -32,7 +32,7 @@ final class MetadataUrlTransformer { if ( $this->looksSerialized( $value ) ) { $unserialized = $this->unserializeValue( $value ); - if ( ! $unserialized['valid'] || is_object( $unserialized['value'] ) ) { + if ( ! $unserialized['valid'] || $this->containsObject( $unserialized['value'] ) ) { return $value; } @@ -118,4 +118,25 @@ final class MetadataUrlTransformer { return '' !== $trimmed && in_array( $trimmed[0], array( '{', '[' ), true ); } + + /** + * @param mixed $value Value to inspect. + */ + private function containsObject( $value ): bool { + if ( is_object( $value ) ) { + return true; + } + + if ( ! is_array( $value ) ) { + return false; + } + + foreach ( $value as $item ) { + if ( $this->containsObject( $item ) ) { + return true; + } + } + + return false; + } } diff --git a/tests/Unit/Url/MetadataUrlTransformerTest.php b/tests/Unit/Url/MetadataUrlTransformerTest.php index 3995a65..f73fa1c 100644 --- a/tests/Unit/Url/MetadataUrlTransformerTest.php +++ b/tests/Unit/Url/MetadataUrlTransformerTest.php @@ -100,6 +100,13 @@ class MetadataUrlTransformerTest extends TestCase { self::assertSame( $value, $transformer->transformValue( $value, $this->mappings() ) ); } + public function test_it_leaves_serialized_payloads_with_nested_objects_unchanged(): void { + $transformer = new MetadataUrlTransformer( new UrlTransformer() ); + $value = 'a:2:{s:3:"url";s:28:"https://example.test/inside";s:6:"object";O:8:"stdClass":0:{}}'; + + self::assertSame( $value, $transformer->transformValue( $value, $this->mappings() ) ); + } + public function test_it_leaves_invalid_json_strings_unchanged(): void { $transformer = new MetadataUrlTransformer( new UrlTransformer() ); $value = '{"url":"https://example.test/missing"';