diff --git a/DataCollector/SerializerDataCollector.php b/DataCollector/SerializerDataCollector.php index 671239d28c7..2880dea37d8 100644 --- a/DataCollector/SerializerDataCollector.php +++ b/DataCollector/SerializerDataCollector.php @@ -21,7 +21,7 @@ /** * @author Mathias Arlaud * - * @internal + * @final */ class SerializerDataCollector extends DataCollector implements LateDataCollectorInterface { diff --git a/Debug/TraceableEncoder.php b/Debug/TraceableEncoder.php index 0795d14ca0c..afefee0ee6f 100644 --- a/Debug/TraceableEncoder.php +++ b/Debug/TraceableEncoder.php @@ -23,7 +23,7 @@ * * @author Mathias Arlaud * - * @internal + * @final */ class TraceableEncoder implements EncoderInterface, DecoderInterface, SerializerAwareInterface { diff --git a/Debug/TraceableNormalizer.php b/Debug/TraceableNormalizer.php index 50842a7b92f..1aa78804917 100644 --- a/Debug/TraceableNormalizer.php +++ b/Debug/TraceableNormalizer.php @@ -24,7 +24,7 @@ * * @author Mathias Arlaud * - * @internal + * @final */ class TraceableNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface, NormalizerAwareInterface, DenormalizerAwareInterface { diff --git a/Debug/TraceableSerializer.php b/Debug/TraceableSerializer.php index 9cf7bad80bd..898e8956077 100644 --- a/Debug/TraceableSerializer.php +++ b/Debug/TraceableSerializer.php @@ -23,7 +23,7 @@ * * @author Mathias Arlaud * - * @internal + * @final */ class TraceableSerializer implements SerializerInterface, NormalizerInterface, DenormalizerInterface, EncoderInterface, DecoderInterface { diff --git a/NameConverter/MetadataAwareNameConverter.php b/NameConverter/MetadataAwareNameConverter.php index bc693bd903b..eec3b42ce5e 100644 --- a/NameConverter/MetadataAwareNameConverter.php +++ b/NameConverter/MetadataAwareNameConverter.php @@ -43,10 +43,6 @@ public function __construct( public function normalize(string $propertyName, ?string $class = null, ?string $format = null, array $context = []): string { - $class = 1 < \func_num_args() ? func_get_arg(1) : null; - $format = 2 < \func_num_args() ? func_get_arg(2) : null; - $context = 3 < \func_num_args() ? func_get_arg(3) : []; - if (null === $class) { return $this->normalizeFallback($propertyName, $class, $format, $context); } @@ -60,10 +56,6 @@ public function normalize(string $propertyName, ?string $class = null, ?string $ public function denormalize(string $propertyName, ?string $class = null, ?string $format = null, array $context = []): string { - $class = 1 < \func_num_args() ? func_get_arg(1) : null; - $format = 2 < \func_num_args() ? func_get_arg(2) : null; - $context = 3 < \func_num_args() ? func_get_arg(3) : []; - if (null === $class) { return $this->denormalizeFallback($propertyName, $class, $format, $context); } diff --git a/Normalizer/AbstractObjectNormalizer.php b/Normalizer/AbstractObjectNormalizer.php index 3275d976a10..63068420ba1 100644 --- a/Normalizer/AbstractObjectNormalizer.php +++ b/Normalizer/AbstractObjectNormalizer.php @@ -767,6 +767,12 @@ private function validateAndDenormalize(Type $type, string $currentClass, string $class = null; } } + } elseif ($t instanceof ObjectType) { + $typeIdentifier = TypeIdentifier::OBJECT; + $class = $t->getClassName(); + } else { + $typeIdentifier = $t->getTypeIdentifier(); + $class = null; } } else { if ($t instanceof ObjectType) { diff --git a/Tests/Encoder/CsvEncoderTest.php b/Tests/Encoder/CsvEncoderTest.php index 13c0dcc08d0..c0be73a8bd6 100644 --- a/Tests/Encoder/CsvEncoderTest.php +++ b/Tests/Encoder/CsvEncoderTest.php @@ -149,7 +149,7 @@ public function testEncodeCustomSettings() $this->encoder = new CsvEncoder([ CsvEncoder::DELIMITER_KEY => ';', CsvEncoder::ENCLOSURE_KEY => "'", - CsvEncoder::ESCAPE_CHAR_KEY => '|', + CsvEncoder::ESCAPE_CHAR_KEY => '', CsvEncoder::KEY_SEPARATOR_KEY => '-', ]); @@ -175,7 +175,7 @@ public function testEncodeCustomSettingsPassedInContext() , $this->encoder->encode($value, 'csv', [ CsvEncoder::DELIMITER_KEY => ';', CsvEncoder::ENCLOSURE_KEY => "'", - CsvEncoder::ESCAPE_CHAR_KEY => '|', + CsvEncoder::ESCAPE_CHAR_KEY => '', CsvEncoder::KEY_SEPARATOR_KEY => '-', ])); } @@ -185,7 +185,7 @@ public function testEncodeCustomSettingsPassedInConstructor() $encoder = new CsvEncoder([ CsvEncoder::DELIMITER_KEY => ';', CsvEncoder::ENCLOSURE_KEY => "'", - CsvEncoder::ESCAPE_CHAR_KEY => '|', + CsvEncoder::ESCAPE_CHAR_KEY => '', CsvEncoder::KEY_SEPARATOR_KEY => '-', ]); $value = ['a' => 'he\'llo', 'c' => ['d' => 'foo']]; @@ -574,7 +574,7 @@ public function testDecodeCustomSettings() $this->encoder = new CsvEncoder([ CsvEncoder::DELIMITER_KEY => ';', CsvEncoder::ENCLOSURE_KEY => "'", - CsvEncoder::ESCAPE_CHAR_KEY => '|', + CsvEncoder::ESCAPE_CHAR_KEY => '', CsvEncoder::KEY_SEPARATOR_KEY => '-', ]); @@ -596,7 +596,7 @@ public function testDecodeCustomSettingsPassedInContext() , 'csv', [ CsvEncoder::DELIMITER_KEY => ';', CsvEncoder::ENCLOSURE_KEY => "'", - CsvEncoder::ESCAPE_CHAR_KEY => '|', + CsvEncoder::ESCAPE_CHAR_KEY => '', CsvEncoder::KEY_SEPARATOR_KEY => '-', ])); } @@ -606,7 +606,7 @@ public function testDecodeCustomSettingsPassedInConstructor() $encoder = new CsvEncoder([ CsvEncoder::DELIMITER_KEY => ';', CsvEncoder::ENCLOSURE_KEY => "'", - CsvEncoder::ESCAPE_CHAR_KEY => '|', + CsvEncoder::ESCAPE_CHAR_KEY => '', CsvEncoder::KEY_SEPARATOR_KEY => '-', CsvEncoder::AS_COLLECTION_KEY => true, // Can be removed in 5.0 ]); diff --git a/Tests/NameConverter/CamelCaseToSnakeCaseNameConverterTest.php b/Tests/NameConverter/CamelCaseToSnakeCaseNameConverterTest.php index fc9967f0c5f..d1edc2325d7 100644 --- a/Tests/NameConverter/CamelCaseToSnakeCaseNameConverterTest.php +++ b/Tests/NameConverter/CamelCaseToSnakeCaseNameConverterTest.php @@ -61,9 +61,9 @@ public static function attributeProvider() public function testDenormalizeWithContext() { $nameConverter = new CamelCaseToSnakeCaseNameConverter(null, true); - $denormalizedValue = $nameConverter->denormalize('last_name', null, null, [CamelCaseToSnakeCaseNameConverter::REQUIRE_SNAKE_CASE_PROPERTIES]); + $denormalizedValue = $nameConverter->denormalize('last_name', null, null, [CamelCaseToSnakeCaseNameConverter::REQUIRE_SNAKE_CASE_PROPERTIES => true]); - $this->assertSame($denormalizedValue, 'lastName'); + $this->assertSame('lastName', $denormalizedValue); } public function testErrorDenormalizeWithContext() diff --git a/Tests/Normalizer/AbstractObjectNormalizerTest.php b/Tests/Normalizer/AbstractObjectNormalizerTest.php index e1b1031dabe..a666185dd6a 100644 --- a/Tests/Normalizer/AbstractObjectNormalizerTest.php +++ b/Tests/Normalizer/AbstractObjectNormalizerTest.php @@ -1224,6 +1224,29 @@ public function provideDenormalizeWithFilterBoolData(): array [['foo' => 'something'], null], ]; } + + public function testDenormalizeArrayObject() + { + $normalizer = new class() extends AbstractObjectNormalizerDummy { + public function __construct() + { + parent::__construct(null, null, new PhpDocExtractor()); + } + + protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []): bool + { + return true; + } + }; + $serializer = new Serializer([$normalizer]); + $normalizer->setSerializer($serializer); + + $actual = $normalizer->denormalize(['foo' => ['array' => ['key' => 'value']]], DummyWithArrayObject::class); + + $this->assertInstanceOf(DummyWithArrayObject::class, $actual); + $this->assertInstanceOf(\ArrayObject::class, $actual->foo); + $this->assertSame(1, $actual->foo->count()); + } } class AbstractObjectNormalizerDummy extends AbstractObjectNormalizer @@ -1515,6 +1538,12 @@ class BoolPropertyDummy public $foo; } +class DummyWithArrayObject +{ + /** @var \ArrayObject */ + public $foo; +} + class SerializerCollectionDummy implements SerializerInterface, DenormalizerInterface { private array $normalizers;