From ddf1a512eb8c07df2d9c8e7150c40383ef9b29cf Mon Sep 17 00:00:00 2001 From: Asmir Mustafic Date: Fri, 20 Sep 2019 15:39:36 +0200 Subject: [PATCH] do not expose properties instead of virtual-properties when using YAML and --- src/Metadata/Driver/YamlDriver.php | 29 +++++++++---------- ...opertiesAndDuplicatePropNameExcludeAll.php | 26 +++++++++++++++++ tests/Metadata/Driver/BaseDriverTest.php | 13 +++++++++ ...pressionVirtualPropertiesAndExcludeAll.xml | 2 +- ...opertiesAndDuplicatePropNameExcludeAll.xml | 6 ++++ ...opertiesAndDuplicatePropNameExcludeAll.yml | 5 ++++ 6 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 tests/Fixtures/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.php create mode 100644 tests/Metadata/Driver/xml/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.xml create mode 100644 tests/Metadata/Driver/yml/ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll.yml 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