diff --git a/UPGRADE-7.4.md b/UPGRADE-7.4.md index 82bfca8fff4c0..5fdbdc89381c2 100644 --- a/UPGRADE-7.4.md +++ b/UPGRADE-7.4.md @@ -104,6 +104,14 @@ HttpKernel * Deprecate implementing `__sleep/wakeup()` on data collectors; use `__(un)serialize()` instead * Make `Profile` final and `Profiler::__sleep()` internal +JsonStreamer +------------ + + * Deprecate `PropertyMetadata::$streamToNativeValueTransformers`, use `PropertyMetadata::$valueTransformers` instead + * Deprecate `PropertyMetadata::getNativeToStreamValueTransformer()` and `PropertyMetadata::getStreamToNativeValueTransformers()`, use `PropertyMetadata::getValueTransformers()` instead + * Deprecate `PropertyMetadata::withNativeToStreamValueTransformers()` and `PropertyMetadata::withStreamToNativeValueTransformers()`, use `PropertyMetadata::withValueTransformers()` instead + * Deprecate `PropertyMetadata::withAdditionalNativeToStreamValueTransformer()` and `PropertyMetadata::withAdditionalStreamToNativeValueTransformer`, use `PropertyMetadata::withAdditionalValueTransformer()` instead + Mime ---- diff --git a/src/Symfony/Component/JsonStreamer/CHANGELOG.md b/src/Symfony/Component/JsonStreamer/CHANGELOG.md index f5c3c14065ca4..67167181a383d 100644 --- a/src/Symfony/Component/JsonStreamer/CHANGELOG.md +++ b/src/Symfony/Component/JsonStreamer/CHANGELOG.md @@ -9,6 +9,10 @@ CHANGELOG * Add `_current_object` to the context passed to value transformers during write operations * Add `include_null_properties` option to encode the properties with `null` value * Add synthetic properties support + * Deprecate `PropertyMetadata::$streamToNativeValueTransformers`, use `PropertyMetadata::$valueTransformers` instead + * Deprecate `PropertyMetadata::getNativeToStreamValueTransformer()` and `PropertyMetadata::getStreamToNativeValueTransformers()`, use `PropertyMetadata::getValueTransformers()` instead + * Deprecate `PropertyMetadata::withNativeToStreamValueTransformers()` and `PropertyMetadata::withStreamToNativeValueTransformers()`, use `PropertyMetadata::withValueTransformers()` instead + * Deprecate `PropertyMetadata::withAdditionalNativeToStreamValueTransformer()` and `PropertyMetadata::withAdditionalStreamToNativeValueTransformer`, use `PropertyMetadata::withAdditionalValueTransformer()` instead 7.3 --- diff --git a/src/Symfony/Component/JsonStreamer/Mapping/PropertyMetadata.php b/src/Symfony/Component/JsonStreamer/Mapping/PropertyMetadata.php index bff2eada22362..237a6668887e5 100644 --- a/src/Symfony/Component/JsonStreamer/Mapping/PropertyMetadata.php +++ b/src/Symfony/Component/JsonStreamer/Mapping/PropertyMetadata.php @@ -20,16 +20,23 @@ */ final class PropertyMetadata { + private ?array $streamToNativeValueTransformers; + /** - * @param list $nativeToStreamValueTransformers - * @param list $streamToNativeValueTransformers + * @param list $valueTransformers + * @param list|null $streamToNativeValueTransformers */ public function __construct( private ?string $name, private Type $type, - private array $nativeToStreamValueTransformers = [], - private array $streamToNativeValueTransformers = [], + private array $valueTransformers = [], + ?array $streamToNativeValueTransformers = null, ) { + if (null !== $streamToNativeValueTransformers) { + trigger_deprecation('symfony/json-streamer', '7.4', 'The "streamToNativeValueTransformers" parameter of the "%s()" method is deprecated. Use "valueTransformers" instead.', __METHOD__); + } + + $this->streamToNativeValueTransformers = $streamToNativeValueTransformers; } /** @@ -51,7 +58,7 @@ public function getName(): ?string public function withName(?string $name): self { - return new self($name, $this->type, $this->nativeToStreamValueTransformers, $this->streamToNativeValueTransformers); + return new self($name, $this->type, $this->valueTransformers, $this->streamToNativeValueTransformers); } public function getType(): Type @@ -61,28 +68,67 @@ public function getType(): Type public function withType(Type $type): self { - return new self($this->name, $type, $this->nativeToStreamValueTransformers, $this->streamToNativeValueTransformers); + return new self($this->name, $type, $this->valueTransformers, $this->streamToNativeValueTransformers); + } + + /** + * @return list + */ + public function getValueTransformers(): array + { + return $this->valueTransformers; + } + + /** + * @param list $valueTransformers + */ + public function withValueTransformers(array $valueTransformers): self + { + return new self($this->name, $this->type, $valueTransformers); + } + + public function withAdditionalValueTransformer(string|\Closure $valueTransformer): self + { + $valueTransformers = $this->valueTransformers; + + $valueTransformers[] = $valueTransformer; + $valueTransformers = array_values(array_unique($valueTransformers)); + + return $this->withValueTransformers($valueTransformers); } /** + * @deprecated since Symfony 7.4, use "getValueTransformers" instead + * * @return list */ public function getNativeToStreamValueTransformer(): array { - return $this->nativeToStreamValueTransformers; + trigger_deprecation('symfony/json-streamer', '7.4', 'The "%s()" method is deprecated, use "%s::getValueTransformers()" instead.', __METHOD__, self::class); + + return $this->valueTransformers; } /** + * @deprecated since Symfony 7.4, use "withValueTransformers" instead + * * @param list $nativeToStreamValueTransformers */ public function withNativeToStreamValueTransformers(array $nativeToStreamValueTransformers): self { + trigger_deprecation('symfony/json-streamer', '7.4', 'The "%s()" method is deprecated, use "%s::withValueTransformers()" instead.', __METHOD__, self::class); + return new self($this->name, $this->type, $nativeToStreamValueTransformers, $this->streamToNativeValueTransformers); } + /** + * @deprecated since Symfony 7.4, use "withAdditionalValueTransformer" instead + */ public function withAdditionalNativeToStreamValueTransformer(string|\Closure $nativeToStreamValueTransformer): self { - $nativeToStreamValueTransformers = $this->nativeToStreamValueTransformers; + trigger_deprecation('symfony/json-streamer', '7.4', 'The "%s()" method is deprecated, use "%s::withAdditionalValueTransformer()" instead.', __METHOD__, self::class); + + $nativeToStreamValueTransformers = $this->valueTransformers; $nativeToStreamValueTransformers[] = $nativeToStreamValueTransformer; $nativeToStreamValueTransformers = array_values(array_unique($nativeToStreamValueTransformers)); @@ -91,24 +137,37 @@ public function withAdditionalNativeToStreamValueTransformer(string|\Closure $na } /** + * @deprecated since Symfony 7.4, use "getValueTransformers" instead + * * @return list */ public function getStreamToNativeValueTransformers(): array { - return $this->streamToNativeValueTransformers; + trigger_deprecation('symfony/json-streamer', '7.4', 'The "%s()" method is deprecated, use "%s::getValueTransformers()" instead.', __METHOD__, self::class); + + return $this->streamToNativeValueTransformers ?? []; } /** + * @deprecated since Symfony 7.4, use "withValueTransformers" instead + * * @param list $streamToNativeValueTransformers */ public function withStreamToNativeValueTransformers(array $streamToNativeValueTransformers): self { - return new self($this->name, $this->type, $this->nativeToStreamValueTransformers, $streamToNativeValueTransformers); + trigger_deprecation('symfony/json-streamer', '7.4', 'The "%s()" method is deprecated, use "%s::withValueTransformers()" instead.', __METHOD__, self::class); + + return new self($this->name, $this->type, $this->valueTransformers, $streamToNativeValueTransformers); } + /** + * @deprecated since Symfony 7.4, use "withAdditionalValueTransformer" instead + */ public function withAdditionalStreamToNativeValueTransformer(string|\Closure $streamToNativeValueTransformer): self { - $streamToNativeValueTransformers = $this->streamToNativeValueTransformers; + trigger_deprecation('symfony/json-streamer', '7.4', 'The "%s()" method is deprecated, use "%s::withAdditionalValueTransformer()" instead.', __METHOD__, self::class); + + $streamToNativeValueTransformers = $this->streamToNativeValueTransformers ?? []; $streamToNativeValueTransformers[] = $streamToNativeValueTransformer; $streamToNativeValueTransformers = array_values(array_unique($streamToNativeValueTransformers)); diff --git a/src/Symfony/Component/JsonStreamer/Mapping/Read/AttributePropertyMetadataLoader.php b/src/Symfony/Component/JsonStreamer/Mapping/Read/AttributePropertyMetadataLoader.php index 366043b80e1ca..5d263bdd17172 100644 --- a/src/Symfony/Component/JsonStreamer/Mapping/Read/AttributePropertyMetadataLoader.php +++ b/src/Symfony/Component/JsonStreamer/Mapping/Read/AttributePropertyMetadataLoader.php @@ -66,7 +66,7 @@ public function load(string $className, array $options = [], array $context = [] $result[$streamedName] = $initialMetadata ->withType($valueTransformerService::getStreamValueType()) - ->withAdditionalStreamToNativeValueTransformer($valueTransformer); + ->withAdditionalValueTransformer($valueTransformer); continue; } @@ -83,7 +83,7 @@ public function load(string $className, array $options = [], array $context = [] $result[$streamedName] = $initialMetadata ->withType($this->typeResolver->resolve($parameterReflection)) - ->withAdditionalStreamToNativeValueTransformer($valueTransformer); + ->withAdditionalValueTransformer($valueTransformer); } return $result; diff --git a/src/Symfony/Component/JsonStreamer/Mapping/Read/DateTimeTypePropertyMetadataLoader.php b/src/Symfony/Component/JsonStreamer/Mapping/Read/DateTimeTypePropertyMetadataLoader.php index 26bc022cae2e3..f8a11a2e66c37 100644 --- a/src/Symfony/Component/JsonStreamer/Mapping/Read/DateTimeTypePropertyMetadataLoader.php +++ b/src/Symfony/Component/JsonStreamer/Mapping/Read/DateTimeTypePropertyMetadataLoader.php @@ -44,7 +44,7 @@ public function load(string $className, array $options = [], array $context = [] $metadata = $metadata ->withType(StringToDateTimeValueTransformer::getStreamValueType()) - ->withAdditionalStreamToNativeValueTransformer('json_streamer.value_transformer.string_to_date_time'); + ->withAdditionalValueTransformer('json_streamer.value_transformer.string_to_date_time'); } } diff --git a/src/Symfony/Component/JsonStreamer/Mapping/Write/AttributePropertyMetadataLoader.php b/src/Symfony/Component/JsonStreamer/Mapping/Write/AttributePropertyMetadataLoader.php index cdcb93707cf24..136c710a7d6ed 100644 --- a/src/Symfony/Component/JsonStreamer/Mapping/Write/AttributePropertyMetadataLoader.php +++ b/src/Symfony/Component/JsonStreamer/Mapping/Write/AttributePropertyMetadataLoader.php @@ -66,7 +66,7 @@ public function load(string $className, array $options = [], array $context = [] $result[$streamedName] = $initialMetadata ->withType($valueTransformerService::getStreamValueType()) - ->withAdditionalNativeToStreamValueTransformer($valueTransformer); + ->withAdditionalValueTransformer($valueTransformer); continue; } @@ -79,7 +79,7 @@ public function load(string $className, array $options = [], array $context = [] $result[$streamedName] = $initialMetadata ->withType($this->typeResolver->resolve($valueTransformerReflection)) - ->withAdditionalNativeToStreamValueTransformer($valueTransformer); + ->withAdditionalValueTransformer($valueTransformer); } return $result; diff --git a/src/Symfony/Component/JsonStreamer/Mapping/Write/DateTimeTypePropertyMetadataLoader.php b/src/Symfony/Component/JsonStreamer/Mapping/Write/DateTimeTypePropertyMetadataLoader.php index 859dcf7bcecbf..43a443efb99d4 100644 --- a/src/Symfony/Component/JsonStreamer/Mapping/Write/DateTimeTypePropertyMetadataLoader.php +++ b/src/Symfony/Component/JsonStreamer/Mapping/Write/DateTimeTypePropertyMetadataLoader.php @@ -39,7 +39,7 @@ public function load(string $className, array $options = [], array $context = [] if ($type instanceof ObjectType && is_a($type->getClassName(), \DateTimeInterface::class, true)) { $metadata = $metadata ->withType(DateTimeToStringValueTransformer::getStreamValueType()) - ->withAdditionalNativeToStreamValueTransformer('json_streamer.value_transformer.date_time_to_string'); + ->withAdditionalValueTransformer('json_streamer.value_transformer.date_time_to_string'); } } diff --git a/src/Symfony/Component/JsonStreamer/Read/StreamReaderGenerator.php b/src/Symfony/Component/JsonStreamer/Read/StreamReaderGenerator.php index c37d5930742f6..a6aee49162bc9 100644 --- a/src/Symfony/Component/JsonStreamer/Read/StreamReaderGenerator.php +++ b/src/Symfony/Component/JsonStreamer/Read/StreamReaderGenerator.php @@ -135,7 +135,7 @@ private function createDataModel(Type $type, array $options = [], array $context 'name' => $propertyMetadata->getName(), 'value' => $this->createDataModel($propertyMetadata->getType(), $options, $context), 'accessor' => function (string $accessor) use ($propertyMetadata): string { - foreach ($propertyMetadata->getStreamToNativeValueTransformers() as $valueTransformer) { + foreach ($propertyMetadata->getValueTransformers() as $valueTransformer) { if (\is_string($valueTransformer)) { $accessor = "\$valueTransformers->get('$valueTransformer')->transform($accessor, \$options)"; diff --git a/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/AttributePropertyMetadataLoaderTest.php b/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/AttributePropertyMetadataLoaderTest.php index 98eb1cb467609..eb2add479a64e 100644 --- a/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/AttributePropertyMetadataLoaderTest.php +++ b/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/AttributePropertyMetadataLoaderTest.php @@ -42,10 +42,10 @@ public function testRetrieveValueTransformer() ]), TypeResolver::create()); $this->assertEquals([ - 'id' => new PropertyMetadata('id', Type::string(), [], [DivideStringAndCastToIntValueTransformer::class]), - 'active' => new PropertyMetadata('active', Type::string(), [], [StringToBooleanValueTransformer::class]), - 'name' => new PropertyMetadata('name', Type::string(), [], [\Closure::fromCallable('strtoupper')]), - 'range' => new PropertyMetadata('range', Type::string(), [], [\Closure::fromCallable(DummyWithValueTransformerAttributes::explodeRange(...))]), + 'id' => new PropertyMetadata('id', Type::string(), [DivideStringAndCastToIntValueTransformer::class]), + 'active' => new PropertyMetadata('active', Type::string(), [StringToBooleanValueTransformer::class]), + 'name' => new PropertyMetadata('name', Type::string(), [\Closure::fromCallable('strtoupper')]), + 'range' => new PropertyMetadata('range', Type::string(), [\Closure::fromCallable(DummyWithValueTransformerAttributes::explodeRange(...))]), ], $loader->load(DummyWithValueTransformerAttributes::class)); } diff --git a/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/DateTimeTypePropertyMetadataLoaderTest.php b/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/DateTimeTypePropertyMetadataLoaderTest.php index 779499adf21c2..c48198c476aea 100644 --- a/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/DateTimeTypePropertyMetadataLoaderTest.php +++ b/src/Symfony/Component/JsonStreamer/Tests/Mapping/Read/DateTimeTypePropertyMetadataLoaderTest.php @@ -29,8 +29,8 @@ public function testAddStringToDateTimeValueTransformer() ])); $this->assertEquals([ - 'interface' => new PropertyMetadata('interface', Type::string(), [], ['json_streamer.value_transformer.string_to_date_time']), - 'immutable' => new PropertyMetadata('immutable', Type::string(), [], ['json_streamer.value_transformer.string_to_date_time']), + 'interface' => new PropertyMetadata('interface', Type::string(), ['json_streamer.value_transformer.string_to_date_time']), + 'immutable' => new PropertyMetadata('immutable', Type::string(), ['json_streamer.value_transformer.string_to_date_time']), 'other' => new PropertyMetadata('other', Type::object(self::class)), ], $loader->load(self::class)); } diff --git a/src/Symfony/Component/JsonStreamer/Write/StreamWriterGenerator.php b/src/Symfony/Component/JsonStreamer/Write/StreamWriterGenerator.php index a435b0fa108cc..1739a2b58bd60 100644 --- a/src/Symfony/Component/JsonStreamer/Write/StreamWriterGenerator.php +++ b/src/Symfony/Component/JsonStreamer/Write/StreamWriterGenerator.php @@ -135,7 +135,7 @@ private function createDataModel(Type $type, string $accessor, array $options = foreach ($propertiesMetadata as $streamedName => $propertyMetadata) { $propertyAccessor = $propertyMetadata->getName() ? $accessor.'->'.$propertyMetadata->getName() : 'null'; - foreach ($propertyMetadata->getNativeToStreamValueTransformer() as $valueTransformer) { + foreach ($propertyMetadata->getValueTransformers() as $valueTransformer) { if (\is_string($valueTransformer)) { $valueTransformerServiceAccessor = "\$valueTransformers->get('$valueTransformer')"; $propertyAccessor = "{$valueTransformerServiceAccessor}->transform($propertyAccessor, ['_current_object' => $accessor] + \$options)"; diff --git a/src/Symfony/Component/JsonStreamer/composer.json b/src/Symfony/Component/JsonStreamer/composer.json index 01212c7d11f33..7523df4ccd298 100644 --- a/src/Symfony/Component/JsonStreamer/composer.json +++ b/src/Symfony/Component/JsonStreamer/composer.json @@ -19,6 +19,7 @@ "php": ">=8.2", "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^7.2|^8.0", "symfony/type-info": "^7.3.3|^8.0", "symfony/var-exporter": "^7.2|^8.0"