diff --git a/src/Metadata/Driver/YamlDriver.php b/src/Metadata/Driver/YamlDriver.php
index d5f8b5946..bf9e01f32 100644
--- a/src/Metadata/Driver/YamlDriver.php
+++ b/src/Metadata/Driver/YamlDriver.php
@@ -114,6 +114,7 @@ protected function loadMetadataFromFile(ReflectionClass $class, string $file): ?
$this->addClassProperties($metadata, $config);
$propertiesMetadata = [];
+ $propertiesData = [];
if (array_key_exists('virtual_properties', $config)) {
foreach ($config['virtual_properties'] as $methodName => $propertySettings) {
if (isset($propertySettings['exp'])) {
@@ -132,10 +133,8 @@ protected function loadMetadataFromFile(ReflectionClass $class, string $file): ?
$virtualPropertyMetadata = new VirtualPropertyMetadata($name, $methodName);
}
- $pName = !empty($propertySettings['name']) ? $propertySettings['name'] : $virtualPropertyMetadata->name;
-
- $propertiesMetadata[$pName] = $virtualPropertyMetadata;
- $config['properties'][$pName] = $propertySettings;
+ $propertiesMetadata[] = $virtualPropertyMetadata;
+ $propertiesData[] = $propertySettings;
}
}
@@ -146,18 +145,20 @@ protected function loadMetadataFromFile(ReflectionClass $class, string $file): ?
}
$pName = $property->getName();
- $propertiesMetadata[$pName] = new PropertyMetadata($name, $pName);
+ $propertiesMetadata[] = new PropertyMetadata($name, $pName);
+ $propertiesData[] = !empty($config['properties']) && true ===array_key_exists($pName, $config['properties'])
+ ? (array) $config['properties'][$pName]
+ : null;
}
- foreach ($propertiesMetadata as $pName => $pMetadata) {
+ foreach ($propertiesMetadata as $propertyKey => $pMetadata) {
$isExclude = false;
$isExpose = $pMetadata instanceof VirtualPropertyMetadata
|| $pMetadata instanceof ExpressionPropertyMetadata
- || (isset($config['properties']) && array_key_exists($pName, $config['properties']));
-
- if (isset($config['properties'][$pName])) {
- $pConfig = $config['properties'][$pName];
+ || isset($propertiesData[$propertyKey]);
+ $pConfig = $propertiesData[$propertyKey];
+ if (!empty($pConfig)) {
if (isset($pConfig['exclude'])) {
$isExclude = (bool) $pConfig['exclude'];
}
@@ -304,12 +305,8 @@ protected function loadMetadataFromFile(ReflectionClass $class, string $file): ?
$metadata->isMap = $metadata->isMap || PropertyMetadata::isCollectionMap($pMetadata->type);
}
- if (isset($config['properties'][$pName])) {
- $pConfig = $config['properties'][$pName];
-
- if (isset($pConfig['name'])) {
- $pMetadata->name = (string) $pConfig['name'];
- }
+ if (!empty($pConfig) && !empty($pConfig['name'])) {
+ $pMetadata->name = (string) $pConfig['name'];
}
if ((ExclusionPolicy::NONE === $exclusionPolicy && !$isExclude)
diff --git a/tests/Fixtures/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.php b/tests/Fixtures/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.php
new file mode 100644
index 000000000..1bbb99183
--- /dev/null
+++ b/tests/Fixtures/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.php
@@ -0,0 +1,26 @@
+propertyMetadata['age']);
}
+ public function testObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll()
+ {
+ $class = ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll::class;
+ $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass($class));
+
+ $p = new VirtualPropertyMetadata($class, 'name');
+ $p->serializedName = 'mood';
+ $p->getter = 'getName';
+
+ self::assertEquals($p, $m->propertyMetadata['name']);
+ }
+
public function testObjectWithVirtualPropertiesAndDuplicatePropName()
{
$class = ObjectWithVirtualPropertiesAndDuplicatePropName::class;
diff --git a/tests/Metadata/Driver/xml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.xml b/tests/Metadata/Driver/xml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.xml
index 0219cbe11..3164215cf 100644
--- a/tests/Metadata/Driver/xml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.xml
+++ b/tests/Metadata/Driver/xml/ObjectWithExpressionVirtualPropertiesAndExcludeAll.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/tests/Metadata/Driver/xml/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.xml b/tests/Metadata/Driver/xml/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.xml
new file mode 100644
index 000000000..c04373316
--- /dev/null
+++ b/tests/Metadata/Driver/xml/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/tests/Metadata/Driver/yml/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.yml b/tests/Metadata/Driver/yml/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.yml
new file mode 100644
index 000000000..5d1186288
--- /dev/null
+++ b/tests/Metadata/Driver/yml/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.yml
@@ -0,0 +1,5 @@
+JMS\Serializer\Tests\Fixtures\ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll:
+ exclusion_policy: all
+ virtual_properties:
+ getName:
+ serialized_name: mood