Skip to content

Commit

Permalink
Merge pull request #924 from dbojdo/fix/issue-923-default-value-prope…
Browse files Browse the repository at this point in the history
…rty-driver

Fix #923 Enabled support for DefaultValuePropertyDriver
  • Loading branch information
goetas committed Aug 28, 2023
2 parents 3279738 + 2d98b2a commit 3671b41
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 1 deletion.
1 change: 1 addition & 0 deletions DependencyInjection/Configuration.php
Expand Up @@ -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);
Expand Down
9 changes: 9 additions & 0 deletions DependencyInjection/JMSSerializerExtension.php
Expand Up @@ -252,6 +252,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'])
Expand Down
6 changes: 6 additions & 0 deletions Resources/config/services.xml
Expand Up @@ -136,6 +136,12 @@
<argument type="service" id="doctrine_phpcr" />
<argument type="service" id="jms_serializer.type_parser" />
</service>

<service id="jms_serializer.metadata.default_value_property_driver" class="JMS\Serializer\Metadata\Driver\DefaultValuePropertyDriver" public="false">
<argument id="jms_serializer.metadata.default_value_property_driver.inner" type="service"/>
<argument type="service" id="jms_serializer.type_parser" on-invalid="null" />
</service>

<service id="jms_serializer.metadata.typed_properties_driver" class="JMS\Serializer\Metadata\Driver\TypedPropertiesDriver" public="false">
<argument id="jms_serializer.metadata.typed_properties_driver.inner" type="service"/>
<argument type="service" id="jms_serializer.type_parser" on-invalid="null" />
Expand Down
3 changes: 2 additions & 1 deletion Resources/doc/configuration.rst
Expand Up @@ -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:
Expand Down
11 changes: 11 additions & 0 deletions Tests/DependencyInjection/Fixture/DefaultValuePropObject.php
@@ -0,0 +1,11 @@
<?php

namespace JMS\SerializerBundle\Tests\DependencyInjection\Fixture;

class DefaultValuePropObject
{
private string $foo = "some-value";

public function __construct(private string $boo = "another-value") {
}
}
43 changes: 43 additions & 0 deletions Tests/DependencyInjection/JMSSerializerExtensionTest.php
Expand Up @@ -4,14 +4,17 @@

namespace JMS\SerializerBundle\Tests\DependencyInjection;


use Doctrine\Common\Annotations\AnnotationReader;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\Exception\ExpressionLanguageRequiredException;
use JMS\Serializer\Exception\RuntimeException;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\Metadata\Driver\DefaultValuePropertyDriver;
use JMS\Serializer\Metadata\Driver\TypedPropertiesDriver;
use JMS\Serializer\SerializationContext;
use JMS\SerializerBundle\JMSSerializerBundle;
use JMS\SerializerBundle\Tests\DependencyInjection\Fixture\DefaultValuePropObject;
use JMS\SerializerBundle\Tests\DependencyInjection\Fixture\AnotherSimpleObject;
use JMS\SerializerBundle\Tests\DependencyInjection\Fixture\CastDateToIntEventSubscriber;
use JMS\SerializerBundle\Tests\DependencyInjection\Fixture\IncludeInterfaces\AnInterfaceImplementation;
Expand Down Expand Up @@ -790,6 +793,46 @@ public function testTypedDriverIsEnabled()
self::assertSame('int', $metadata->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([
Expand Down

0 comments on commit 3671b41

Please sign in to comment.