Skip to content

Commit 29378f0

Browse files
committed
[WIP][Live] migrate Hydration system to standard Symfony normalizers
1 parent e2df324 commit 29378f0

10 files changed

+378
-411
lines changed

src/LiveComponent/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
+ <div {{ attributes }}>
2222
```
2323

24+
- [BC BREAK] Replace property hydration system with `symfony/serializer` normalizers. This
25+
is a BC break if you've created custom hydrators. They'll need to be converted to
26+
normalizers.
27+
2428
## 2.0.0
2529

2630
- Support for `stimulus` version 2 was removed and support for `@hotwired/stimulus`

src/LiveComponent/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
},
2828
"require": {
2929
"php": ">=8.0",
30+
"symfony/serializer": "^5.4|^6.0",
3031
"symfony/ux-twig-component": "^2.1"
3132
},
3233
"require-dev": {
@@ -38,7 +39,6 @@
3839
"symfony/framework-bundle": "^5.4|^6.0",
3940
"symfony/phpunit-bridge": "^6.0",
4041
"symfony/security-csrf": "^5.4|^6.0",
41-
"symfony/serializer": "^5.4|^6.0",
4242
"symfony/twig-bundle": "^5.4|^6.0",
4343
"symfony/validator": "^5.4|^6.0",
4444
"zenstruck/browser": "^0.9.1",

src/LiveComponent/src/DependencyInjection/Compiler/OptionalDependencyPass.php

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
66
use Symfony\Component\DependencyInjection\ContainerBuilder;
77
use Symfony\Component\DependencyInjection\Reference;
8-
use Symfony\UX\LiveComponent\Hydrator\DoctrineEntityPropertyHydrator;
9-
use Symfony\UX\LiveComponent\Hydrator\NormalizerBridgePropertyHydrator;
8+
use Symfony\UX\LiveComponent\Normalizer\DoctrineObjectNormalizer;
109

1110
/**
1211
* @author Kevin Bond <[email protected]>
@@ -16,16 +15,9 @@ final class OptionalDependencyPass implements CompilerPassInterface
1615
public function process(ContainerBuilder $container): void
1716
{
1817
if ($container->hasDefinition('doctrine')) {
19-
$container->register('ux.live_component.doctrine_entity_property_hydrator', DoctrineEntityPropertyHydrator::class)
20-
->setArguments([[new Reference('doctrine')]])
21-
->addTag('twig.component.property_hydrator', ['priority' => -100])
22-
;
23-
}
24-
25-
if ($container->hasDefinition('serializer')) {
26-
$container->register('ux.live_component.serializer_property_hydrator', NormalizerBridgePropertyHydrator::class)
27-
->setArguments([new Reference('serializer')])
28-
->addTag('twig.component.property_hydrator', ['priority' => -200])
18+
$container->register('ux.live_component.doctrine_object_normalizer', DoctrineObjectNormalizer::class)
19+
->setArguments([[new Reference('doctrine')]]) // todo add other object managers (mongo)
20+
->addTag('serializer.normalizer', ['priority' => 100])
2921
;
3022
}
3123
}

src/LiveComponent/src/DependencyInjection/LiveComponentExtension.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Symfony\UX\LiveComponent\DependencyInjection;
1313

14-
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
1514
use Symfony\Component\DependencyInjection\ChildDefinition;
1615
use Symfony\Component\DependencyInjection\ContainerBuilder;
1716
use Symfony\Component\DependencyInjection\Extension\Extension;
@@ -24,7 +23,7 @@
2423
use Symfony\UX\LiveComponent\EventListener\AddLiveAttributesSubscriber;
2524
use Symfony\UX\LiveComponent\EventListener\LiveComponentSubscriber;
2625
use Symfony\UX\LiveComponent\LiveComponentHydrator;
27-
use Symfony\UX\LiveComponent\PropertyHydratorInterface;
26+
use Symfony\UX\LiveComponent\Normalizer\LiveComponentNormalizer;
2827
use Symfony\UX\LiveComponent\Twig\LiveComponentExtension as LiveComponentTwigExtension;
2928
use Symfony\UX\LiveComponent\Twig\LiveComponentRuntime;
3029
use Symfony\UX\TwigComponent\ComponentFactory;
@@ -54,16 +53,16 @@ function (ChildDefinition $definition, AsLiveComponent $attribute) {
5453
}
5554
);
5655

57-
$container->registerForAutoconfiguration(PropertyHydratorInterface::class)
58-
->addTag('twig.component.property_hydrator')
59-
;
60-
61-
$container->register('ux.live_component.component_hydrator', LiveComponentHydrator::class)
56+
$container->register('ux.live_component.live_component_normalizer', LiveComponentNormalizer::class)
6257
->setArguments([
63-
new TaggedIteratorArgument('twig.component.property_hydrator'),
6458
new Reference('property_accessor'),
6559
'%kernel.secret%',
6660
])
61+
->addTag('serializer.normalizer', ['priority' => 100])
62+
;
63+
64+
$container->register('ux.live_component.component_hydrator', LiveComponentHydrator::class)
65+
->setArguments([new Reference('serializer')])
6766
;
6867

6968
$container->register('ux.live_component.event_subscriber', LiveComponentSubscriber::class)

src/LiveComponent/src/Hydrator/DoctrineEntityPropertyHydrator.php

Lines changed: 0 additions & 75 deletions
This file was deleted.

src/LiveComponent/src/Hydrator/NormalizerBridgePropertyHydrator.php

Lines changed: 0 additions & 58 deletions
This file was deleted.

src/LiveComponent/src/LiveComponentBundle.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\UX\LiveComponent;
1313

14+
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
1415
use Symfony\Component\DependencyInjection\ContainerBuilder;
1516
use Symfony\Component\HttpKernel\Bundle\Bundle;
1617
use Symfony\UX\LiveComponent\DependencyInjection\Compiler\OptionalDependencyPass;
@@ -24,6 +25,7 @@ final class LiveComponentBundle extends Bundle
2425
{
2526
public function build(ContainerBuilder $container): void
2627
{
27-
$container->addCompilerPass(new OptionalDependencyPass());
28+
// must run before Symfony\Component\Serializer\DependencyInjection\SerializerPass
29+
$container->addCompilerPass(new OptionalDependencyPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 100);
2830
}
2931
}

0 commit comments

Comments
 (0)