diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php
index fa883f65..173129a9 100644
--- a/DependencyInjection/Configuration.php
+++ b/DependencyInjection/Configuration.php
@@ -57,6 +57,7 @@ public function getConfigTreeBuilder()
private function addConfigNodes($root): void
{
$root->scalarNode('enum_support')->defaultValue(false)->end();
+ $root->scalarNode('default_value_property_reader_support')->defaultValue(false)->end();
$this->addHandlersSection($root);
$this->addSubscribersSection($root);
$this->addObjectConstructorsSection($root);
diff --git a/DependencyInjection/JMSSerializerExtension.php b/DependencyInjection/JMSSerializerExtension.php
index 35ebc51e..256cd6b5 100644
--- a/DependencyInjection/JMSSerializerExtension.php
+++ b/DependencyInjection/JMSSerializerExtension.php
@@ -264,6 +264,15 @@ private function loadInternal(array $config, ScopedContainer $container, array $
$container->removeDefinition('jms_serializer.enum_subscriber');
}
+ // enable the default value property reader on php 8.0+
+ if (PHP_VERSION_ID >= 80000 && $config['default_value_property_reader_support']) {
+ $container->getDefinition('jms_serializer.metadata.default_value_property_driver')
+ ->setDecoratedService('jms_serializer.metadata_driver')
+ ->setPublic(false);
+ } else {
+ $container->removeDefinition('jms_serializer.metadata.default_value_property_driver');
+ }
+
$container
->getDefinition('jms_serializer.metadata_factory')
->replaceArgument(2, $config['metadata']['debug'])
diff --git a/Resources/config/services.xml b/Resources/config/services.xml
index 9ef4b3b6..162bfef2 100644
--- a/Resources/config/services.xml
+++ b/Resources/config/services.xml
@@ -135,6 +135,12 @@
+
+
+
+
+
+
diff --git a/Resources/doc/configuration.rst b/Resources/doc/configuration.rst
index 7bb5546a..7d43cbfc 100644
--- a/Resources/doc/configuration.rst
+++ b/Resources/doc/configuration.rst
@@ -195,7 +195,8 @@ values:
# config.yml
jms_serializer:
profiler: %kernel.debug%
- enum_support: true # BHP 8.1 Enums support, false by default for backward compatibility
+ enum_support: true # PHP 8.1 Enums support, false by default for backward compatibility
+ default_value_property_reader_support: true # PHP 8.0 Constructor Promotion default value support, false by default for backward compatibility
twig_enabled: 'default' # on which instance is twig enabled
handlers:
datetime:
diff --git a/Tests/DependencyInjection/Fixture/DefaultValuePropObject.php b/Tests/DependencyInjection/Fixture/DefaultValuePropObject.php
new file mode 100644
index 00000000..c91783dd
--- /dev/null
+++ b/Tests/DependencyInjection/Fixture/DefaultValuePropObject.php
@@ -0,0 +1,11 @@
+propertyMetadata['foo']->type['name']);
}
+ public function testDefaultValuePropertyDriverCanBeEnabled()
+ {
+ if (PHP_VERSION_ID < 80000) {
+ $this->markTestSkipped(sprintf('%s requires PHP 8.0', __METHOD__));
+ }
+
+ if (!class_exists(DefaultValuePropertyDriver::class)) {
+ $this->markTestSkipped(sprintf('%s requires %s', __METHOD__, DefaultValuePropertyDriver::class));
+ }
+
+ $container = $this->getContainerForConfig([
+ ['default_value_property_reader_support' => true],
+ ]);
+
+ $metadata = $container->get('jms_serializer.metadata_driver')
+ ->loadMetadataForClass(new \ReflectionClass(DefaultValuePropObject::class));
+
+ self::assertSame('some-value', $metadata->propertyMetadata['foo']->defaultValue);
+ self::assertSame('another-value', $metadata->propertyMetadata['boo']->defaultValue);
+
+ $serializer = $container->get('jms_serializer');
+ $object = new DefaultValuePropObject();
+ $this->assertEquals('{"foo":"some-value","boo":"another-value"}', $serializer->serialize($object, 'json'));
+ $this->assertEquals($object, $serializer->deserialize('{}', DefaultValuePropObject::class, 'json'));
+ }
+
+ public function testDefaultValuePropertyDriverIsDisabledByDefault()
+ {
+ if (PHP_VERSION_ID < 80000) {
+ $this->markTestSkipped(sprintf('%s requires PHP 8.0', __METHOD__));
+ }
+
+ $container = $this->getContainerForConfig([[]]);
+
+ $serializer = $container->get('jms_serializer');
+ $object = new DefaultValuePropObject();
+
+ $this->assertNotEquals($object, $serializer->deserialize('{}', DefaultValuePropObject::class, 'json'));
+ }
+
public function testIncludeInterfaces()
{
$container = $this->getContainerForConfig([