8000 [Serializer] Fix denormalizing custom class in UidNormalizer · symfony/symfony@0634cf2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0634cf2

Browse files
committed
[Serializer] Fix denormalizing custom class in UidNormalizer
1 parent 2f3ddb6 commit 0634cf2

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

src/Symfony/Component/Serializer/Normalizer/UidNormalizer.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,15 @@ public function supportsNormalization($data, string $format = null)
7070
public function denormalize($data, string $type, string $format = null, array $context = [])
7171
{
7272
try {
73-
return Ulid::class === $type ? Ulid::fromString($data) : Uuid::fromString($data);
73+
return AbstractUid::class !== $type ? $type::fromString($data) : Uuid::fromString($data);
7474
} catch (\InvalidArgumentException $exception) {
7575
throw new NotNormalizableValueException(sprintf('The data is not a valid "%s" string representation.', $type));
76+
} catch (\Error $e) {
77+
if (str_starts_with($e->getMessage(), 'Cannot instantiate abstract class')) {
78+
return $this->denormalize($data, AbstractUid::class, $format, $context);
79+
}
80+
81+
throw $e;
7682
}
7783
}
7884

src/Symfony/Component/Serializer/Tests/Normalizer/UidNormalizerTest.php

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ public function dataProvider()
116116
['4126dbc1-488e-4f6e-aadd-775dcbac482e', UuidV4::class],
117117
['18cdf3d3-ea1b-5b23-a9c5-40abd0e2df22', UuidV5::class],
118118
['1ea6ecef-eb9a-66fe-b62b-957b45f17e43', UuidV6::class],
119-
['1ea6ecef-eb9a-66fe-b62b-957b45f17e43', AbstractUid::class],
120119
['01E4BYF64YZ97MDV6RH0HAMN6X', Ulid::class],
120+
['01FPT3YXZXJ1J437FES7CR5BCB', TestCustomUid::class],
121121
];
122122
}
123123

@@ -134,16 +134,32 @@ public function testSupportsDenormalizationForNonUid()
134134
$this->assertFalse($this->normalizer->supportsDenormalization('foo', \stdClass::class));
135135
}
136136

137+
public function testSupportOurAbstractUid()
138+
{
139+
$this->assertTrue($this->normalizer->supportsDenormalization('1ea6ecef-eb9a-66fe-b62b-957b45f17e43', AbstractUid::class));
140+
}
141+
142+
public function testSupportCustomAbstractUid()
143+
{
144+
$this->assertTrue($this->normalizer->supportsDenormalization('ccc', TestAbstractCustomUid::class));
145+
}
146+
137147
/**
138148
* @dataProvider dataProvider
139149
*/
140150
public function testDenormalize($uuidString, $class)
141151
{
142-
if (Ulid::class === $class) {
143-
$this->assertEquals(new Ulid($uuidString), $this->normalizer->denormalize($uuidString, $class));
144-
} else {
145-
$this->assertEquals(Uuid::fromString($uuidString), $this->normalizer->denormalize($uuidString, $class));
146-
}
152+
$this->assertEquals($class::fromString($uuidString), $this->normalizer->denormalize($uuidString, $class));
153+
}
154+
155+
public function testDenormalizeOurAbstractUid()
156+
{
157+
$this->assertEquals(Uuid::fromString($uuidString = '1ea6ecef-eb9a-66fe-b62b-957b45f17e43'), $this->normalizer->denormalize($uuidString, AbstractUid::class));
158+
}
159+
160+
public function testDenormalizeCustomAbstractUid()
161+
{
162+
$this->assertEquals(Uuid::fromString($uuidString = '1ea6ecef-eb9a-66fe-b62b-957b45f17e43'), $this->normalizer->denormalize($uuidString, TestAbstractCustomUid::class));
147163
}
148164

149165
public function testNormalizeWithNormalizationFormatPassedInConstructor()
@@ -169,3 +185,11 @@ public function testNormalizeWithNormalizationFormatNotValid()
169185
]);
170186
}
171187
}
188+
189+
class TestCustomUid extends Ulid
190+
{
191+
}
192+
193+
abstract class TestAbstractCustomUid extends Ulid
194+
{
195+
}

0 commit comments

Comments
 (0)
0