Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2b7fc2b

Browse files
committed
[Serializer][UidNormalizer] Add normalization formats
1 parent 29c7bfa commit 2b7fc2b

File tree

3 files changed

+139
-21
lines changed

3 files changed

+139
-21
lines changed

src/Symfony/Component/Serializer/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
5.3.0
5+
-----
6+
7+
* added normalization formats to `UidNormalizer`
8+
49
5.2.0
510
-----
611

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,49 @@
1111

1212
namespace Symfony\Component\Serializer\Normalizer;
1313

14+
use Symfony\Component\Serializer\Exception\LogicException;
1415
use Symfony\Component\Serializer\Exception\NotNormalizableValueException;
1516
use Symfony\Component\Uid\AbstractUid;
1617
use Symfony\Component\Uid\Ulid;
1718
use Symfony\Component\Uid\Uuid;
1819

1920
final class UidNormalizer implements NormalizerInterface, DenormalizerInterface, CacheableSupportsMethodInterface
2021
{
22+
public const NORMALIZATION_FORMAT_KEY = 'uid_normalization_format';
23+
24+
public const NORMALIZATION_FORMAT_CANONICAL = 'canonical';
25+
public const NORMALIZATION_FORMAT_BASE_58 = 'base_58';
26+
public const NORMALIZATION_FORMAT_BASE_32 = 'base_32';
27+
public const NORMALIZATION_FORMAT_RFC_4122 = 'rfc_4122';
28+
29+
private $defaultContext = [
30+
self::NORMALIZATION_FORMAT_KEY => self::NORMALIZATION_FORMAT_CANONICAL,
31+
];
32+
33+
public function __construct(array $defaultContext = [])
34+
{
35+
$this->defaultContext = array_merge($this->defaultContext, $defaultContext);
36+
}
37+
2138
/**
2239
* {@inheritdoc}
40+
*
41+
* @param AbstractUid $object
2342
*/
2443
public function normalize($object, string $format = null, array $context = [])
2544
{
26-
return (string) $object;
45+
switch ($context[self::NORMALIZATION_FORMAT_KEY] ?? $this->defaultContext[self::NORMALIZATION_FORMAT_KEY]) {
46+
case self::NORMALIZATION_FORMAT_CANONICAL:
47+
return (string) $object;
48+
case self::NORMALIZATION_FORMAT_BASE_58:
49+
return $object->toBase58();
50+
case self::NORMALIZATION_FORMAT_BASE_32:
51+
return $object->toBase32();
52+
case self::NORMALIZATION_FORMAT_RFC_4122:
53+
return $object->toRfc4122();
54+
}
55+
56+
throw new LogicException(sprintf('The "%s" format is not valid.', $context[self::NORMALIZATION_FORMAT_KEY] ?? $this->defaultContext[self::NORMALIZATION_FORMAT_KEY]));
2757
}
2858

2959
/**

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

Lines changed: 103 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use PHPUnit\Framework\TestCase;
66
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
7+
use Symfony\Component\Serializer\Exception\LogicException;
78
use Symfony\Component\Serializer\Normalizer\UidNormalizer;
89
use Symfony\Component\Uid\AbstractUid;
910
use Symfony\Component\Uid\Ulid;
@@ -26,19 +27,6 @@ protected function setUp(): void
2627
$this->normalizer = new UidNormalizer();
2728
}
2829

29-
public function dataProvider()
30-
{
31-
return [
32-
['9b7541de-6f87-11ea-ab3c-9da9a81562fc', UuidV1::class],
33-
['e576629b-ff34-3642-9c08-1f5219f0d45b', UuidV3::class],
34-
['4126dbc1-488e-4f6e-aadd-775dcbac482e', UuidV4::class],
35-
['18cdf3d3-ea1b-5b23-a9c5-40abd0e2df22', UuidV5::class],
36-
['1ea6ecef-eb9a-66fe-b62b-957b45f17e43', UuidV6::class],
37-
['1ea6ecef-eb9a-66fe-b62b-957b45f17e43', AbstractUid::class],
38-
['01E4BYF64YZ97MDV6RH0HAMN6X', Ulid::class],
39-
];
40-
}
41-
4230
public function testSupportsNormalization()
4331
{
4432
$this->assertTrue($this->normalizer->supportsNormalization(Uuid::v1()));
@@ -50,16 +38,88 @@ public function testSupportsNormalization()
5038
$this->assertFalse($this->normalizer->supportsNormalization(new \stdClass()));
5139
}
5240

41+
public function normalizeProvider()
42+
{
43+
$uidFormats = [null, 'canonical', 'base_58', 'base_32', 'rfc_4122'];
44+
$data = [
45+
[
46+
UuidV1::fromString('9b7541de-6f87-11ea-ab3c-9da9a81562fc'),
47+
'9b7541de-6f87-11ea-ab3c-9da9a81562fc',
48+
'9b7541de-6f87-11ea-ab3c-9da9a81562fc',
49+
'LCQS8f2p5SDSiAt9V7ZYnF',
50+
'4VEN0XWVW727NAPF4XN6M1ARQW',
51+
'9b7541de-6f87-11ea-ab3c-9da9a81562fc'
52+
],
53+
[
54+
UuidV3::fromString('e576629b-ff34-3642-9c08-1f5219f0d45b'),
55+
'e576629b-ff34-3642-9c08-1f5219f0d45b',
56+
'e576629b-ff34-3642-9c08-1f5219f0d45b',
57+
'VLRwe3qfi66uUAE3mYQ4Dp',
58+
'75ESH9QZSM6S19R20ZA8CZ1N2V',
59+
'e576629b-ff34-3642-9c08-1f5219f0d45b',
60+
],
61+
[
62+
UuidV4::fromString('4126dbc1-488e-4f6e-aadd-775dcbac482e'),
63+
'4126dbc1-488e-4f6e-aadd-775dcbac482e',
64+
'4126dbc1-488e-4f6e-aadd-775dcbac482e',
65+
'93d88pS3fdrDXNR2XxU9nu',
66+
'214VDW2J4E9XQANQBQBQ5TRJ1E',
67+
'4126dbc1-488e-4f6e-aadd-775dcbac482e',
68+
],
69+
[
70+
UuidV5::fromString('18cdf3d3-ea1b-5b23-a9c5-40abd0e2df22'),
71+
'18cdf3d3-ea1b-5b23-a9c5-40abd0e2df22',
72+
'18cdf3d3-ea1b-5b23-a9c5-40abd0e2df22',
73+
'44epMFQYZ9byVSGis5dofo',
74+
'0RSQSX7TGVBCHTKHA0NF8E5QS2',
75+
'18cdf3d3-ea1b-5b23-a9c5-40abd0e2df22',
76+
],
77+
[
78+
UuidV6::fromString('1ea6ecef-eb9a-66fe-b62b-957b45f17e43'),
79+
'1ea6ecef-eb9a-66fe-b62b-957b45f17e43',
80+
'1ea6ecef-eb9a-66fe-b62b-957b45f17e43',
81+
'4nXtvo2iuyYefrqTMhvogn',
82+
'0YMVPEZTWTCVZBCAWNFD2Z2ZJ3',
83+
'1ea6ecef-eb9a-66fe-b62b-957b45f17e43',
84+
],
85+
[
86+
Ulid::fromString('01E4BYF64YZ97MDV6RH0HAMN6X'),
87+
'01E4BYF64YZ97MDV6RH0HAMN6X',
88+
'01E4BYF64YZ97MDV6RH0HAMN6X',
89+
'1BKuy2YWf8Yf9vSkA2wDpg',
90+
'01E4BYF64YZ97MDV6RH0HAMN6X',
91+
'017117e7-989e-fa4f-46ec-d88822aa54dd',
92+
],
93+
];
94+
95+
foreach ($uidFormats as $i => $uidFormat) {
96+
foreach ($data as $uidClass => $row) {
97+
yield [$row[$i + 1], $row[0], $uidFormat];
98+
}
99+
}
100+
}
101+
53102
/**
54-
* @dataProvider dataProvider
103+
* @dataProvider normalizeProvider
55104
*/
56-
public function testNormalize($uuidString, $class)
105+
public function testNormalize(string $expected, AbstractUid $uid, ?string $uidFormat)
57106
{
58-
if (Ulid::class === $class) {
59-
$this->assertEquals($uuidString, $this->normalizer->normalize(Ulid::fromString($uuidString)));
60-
} else {
61-
$this->assertEquals($uuidString, $this->normalizer->normalize(Uuid::fromString($uuidString)));
62-
}
107+
$this->assertSame($expected, $this->normalizer->normalize($uid, null, null !== $uidFormat ? [
108+
'uid_normalization_format' => $uidFormat,
109+
] : []));
110+
}
111+
112+
public function dataProvider()
113+
{
114+
return [
115+
['9b7541de-6f87-11ea-ab3c-9da9a81562fc', UuidV1::class],
116+
['e576629b-ff34-3642-9c08-1f5219f0d45b', UuidV3::class],
117+
['4126dbc1-488e-4f6e-aadd-775dcbac482e', UuidV4::class],
118+
['18cdf3d3-ea1b-5b23-a9c5-40abd0e2df22', UuidV5::class],
119+
['1ea6ecef-eb9a-66fe-b62b-957b45f17e43', UuidV6::class],
120+
['1ea6ecef-eb9a-66fe-b62b-957b45f17e43', AbstractUid::class],
121+
['01E4BYF64YZ97MDV6RH0HAMN6X', Ulid::class],
122+
];
63123
}
64124

65125
/**
@@ -86,4 +146,27 @@ public function testDenormalize($uuidString, $class)
86146
$this->assertEquals(Uuid::fromString($uuidString), $this->normalizer->denormalize($uuidString, $class));
87147
}
88148
}
149+
150+
public function testNormalizeWithNormalizationFormatPassedInConstructor()
151+
{
152+
$uidNormalizer = new UidNormalizer([
153+
'uid_normalization_format' => 'rfc_4122',
154+
]);
155+
$ulid = Ulid::fromString('01ETWV01C0GYQ5N92ZK7QRGB10');
156+
157+
$this->assertSame('0176b9b0-0580-87ae-5aa4-5f99ef882c20', $uidNormalizer->normalize($ulid));
158+
$this->assertSame('01ETWV01C0GYQ5N92ZK7QRGB10', $uidNormalizer->normalize($ulid, null, [
159+
'uid_normalization_format' => 'canonical',
160+
]));
161+
}
162+
163+
public function testNormalizeWithNormalizationFormatNotValid()
164+
{
165+
$this->expectException(LogicException::class);
166+
$this->expectDeprecationMessage('The "ccc" format is not valid.');
167+
168+
$this->normalizer->normalize(new Ulid(), null, [
169+
'uid_normalization_format' => 'ccc',
170+
]);
171+
}
89172
}

0 commit comments

Comments
 (0)