Skip to content

Commit 704d0be

Browse files
committed
feature #50212 [FrameworkBundle][Serializer] Add TranslatableNormalizer (Jean-Beru)
This PR was squashed before being merged into the 6.4 branch. Discussion ---------- [FrameworkBundle][Serializer] Add TranslatableNormalizer | Q | A | ------------- | --- | Branch? | 6.4 | Bug fix? | no | New feature? | yes | Deprecations? | maybe | Tickets | | License | MIT | Doc PR | WIP In 5.2, Symfony introduced translatable objects. This PR adds a dedicated normalizer to translate them. It can be useful for an API to return translated properties. Also I'm wondering if it could be considered as a BC break since translatable objects were handled by the ObjectNormalizer which currently returns a plain object. PS: if accepted, I'll rebase this PR on 6.4 since 6.3 is closed for new features. Commits ------- 1ac8a2b9be [FrameworkBundle][Serializer] Add TranslatableNormalizer
2 parents 785fa91 + 5d015e3 commit 704d0be

File tree

5 files changed

+27
-0
lines changed

5 files changed

+27
-0
lines changed

DependencyInjection/FrameworkExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1894,6 +1894,10 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
18941894
$container->removeDefinition('serializer.normalizer.mime_message');
18951895
}
18961896

1897+
if (!class_exists(Translator::class)) {
1898+
$container->removeDefinition('serializer.normalizer.translatable');
1899+
}
1900+
18971901
// compat with Symfony < 6.3
18981902
if (!is_subclass_of(ProblemNormalizer::class, SerializerAwareInterface::class)) {
18991903
$container->getDefinition('serializer.normalizer.problem')

Resources/config/serializer.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
4848
use Symfony\Component\Serializer\Normalizer\ProblemNormalizer;
4949
use Symfony\Component\Serializer\Normalizer\PropertyNormalizer;
50+
use Symfony\Component\Serializer\Normalizer\TranslatableNormalizer;
5051
use Symfony\Component\Serializer\Normalizer\UidNormalizer;
5152
use Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer;
5253
use Symfony\Component\Serializer\Serializer;
@@ -113,6 +114,10 @@
113114
->set('serializer.normalizer.uid', UidNormalizer::class)
114115
->tag('serializer.normalizer', ['priority' => -890])
115116

117+
->set('serializer.normalizer.translatable', TranslatableNormalizer::class)
118+
->args(['$translator' => service('translator')])
119+
->tag('serializer.normalizer', ['priority' => -890])
120+
116121
->set('serializer.normalizer.form_error', FormErrorNormalizer::class)
117122
->tag('serializer.normalizer', ['priority' => -915])
118123

Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
use Symfony\Component\Serializer\Normalizer\FormErrorNormalizer;
7676
use Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer;
7777
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
78+
use Symfony\Component\Serializer\Normalizer\TranslatableNormalizer;
7879
use Symfony\Component\Serializer\Serializer;
7980
use Symfony\Component\Translation\DependencyInjection\TranslatorPass;
8081
use Symfony\Component\Translation\LocaleSwitcher;
@@ -1586,6 +1587,18 @@ public function testConstraintViolationListNormalizerRegistered()
15861587
$this->assertEquals(new Reference('serializer.name_converter.metadata_aware'), $definition->getArgument(1));
15871588
}
15881589

1590+
public function testTranslatableNormalizerRegistered()
1591+
{
1592+
$container = $this->createContainerFromFile('full');
1593+
1594+
$definition = $container->getDefinition('serializer.normalizer.translatable');
1595+
$tag = $definition->getTag('serializer.normalizer');
1596+
1597+
$this->assertSame(TranslatableNormalizer::class, $definition->getClass());
1598+
$this->assertSame(-890, $tag[0]['priority']);
1599+
$this->assertEquals(new Reference('translator'), $definition->getArgument('$translator'));
1600+
}
1601+
15891602
public function testSerializerCacheActivated()
15901603
{
15911604
$container = $this->createContainerFromFile('serializer_enabled');

Tests/Functional/SerializerTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public static function provideNormalizersAndEncodersWithDefaultContextOption():
6060
['serializer.normalizer.json_serializable.alias'],
6161
['serializer.normalizer.problem.alias'],
6262
['serializer.normalizer.uid.alias'],
63+
['serializer.normalizer.translatable.alias'],
6364
['serializer.normalizer.object.alias'],
6465
['serializer.encoder.xml.alias'],
6566
['serializer.encoder.yaml.alias'],

Tests/Functional/app/Serializer/config.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ services:
3939
alias: serializer.normalizer.uid
4040
public: true
4141

42+
serializer.normalizer.translatable.alias:
43+
alias: serializer.normalizer.translatable
44+
public: true
45+
4246
serializer.normalizer.property.alias:
4347
alias: serializer.normalizer.property
4448
public: true

0 commit comments

Comments
 (0)