Skip to content

Commit

Permalink
Merge pull request #1126 from schmittjoh/i596-implicit-expose-property
Browse files Browse the repository at this point in the history
Avoid implicit expose of a property instead of virtual-property
  • Loading branch information
goetas committed Sep 20, 2019
2 parents ff89778 + 78092dc commit 7344ef9
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 19 deletions.
4 changes: 2 additions & 2 deletions src/Metadata/Driver/XmlDriver.php
Expand Up @@ -158,8 +158,8 @@ protected function loadMetadataFromFile(\ReflectionClass $class, string $path):
if ($property->class !== $name || (isset($property->info) && $property->info['class'] !== $name)) {
continue;
}

$propertiesMetadata[] = new PropertyMetadata($name, $pName = $property->getName());
$pName = $property->getName();
$propertiesMetadata[] = new PropertyMetadata($name, $pName);
$pElems = $elem->xpath("./property[@name = '" . $pName . "']");

$propertiesNodes[] = $pElems ? reset($pElems) : null;
Expand Down
29 changes: 13 additions & 16 deletions src/Metadata/Driver/YamlDriver.php
Expand Up @@ -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'])) {
Expand All @@ -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;
}
}

Expand All @@ -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'];
}
Expand Down Expand Up @@ -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)
Expand Down
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace JMS\Serializer\Tests\Fixtures;

use JMS\Serializer\Annotation as Serializer;
use JMS\Serializer\Annotation\VirtualProperty;

/**
* @Serializer\ExclusionPolicy("ALL")
*/
class ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll
{
protected $name;

/**
* @Serializer\SerializedName("mood")
*
* @VirtualProperty()
*/
public function getName()
{
return 'value';
}
}
13 changes: 13 additions & 0 deletions tests/Metadata/Driver/BaseDriverTest.php
Expand Up @@ -21,6 +21,7 @@
use JMS\Serializer\Tests\Fixtures\ObjectWithExpressionVirtualPropertiesAndExcludeAll;
use JMS\Serializer\Tests\Fixtures\ObjectWithInvalidExpression;
use JMS\Serializer\Tests\Fixtures\ObjectWithVirtualPropertiesAndDuplicatePropName;
use JMS\Serializer\Tests\Fixtures\ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll;
use JMS\Serializer\Tests\Fixtures\ObjectWithVirtualPropertiesAndExcludeAll;
use JMS\Serializer\Tests\Fixtures\ParentSkipWithEmptyChild;
use Metadata\Driver\DriverInterface;
Expand Down Expand Up @@ -566,6 +567,18 @@ public function testExclusionIf()
self::assertEquals($p, $m->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;
Expand Down
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<serializer>
<class name="JMS\Serializer\Tests\Fixtures\ObjectWithExpressionVirtualPropertiesAndExcludeAll" exclusion-policy="ALL">
<class name="JMS\Serializer\Tests\Fixtures\ObjectWithExpressionVirtualPropertiesAndExcludeAll" exclusion-policy="ALL">
<virtual-property name="virtualValue" expression="object.getVirtualValue()"/>
</class>
</serializer>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<serializer>
<class name="JMS\Serializer\Tests\Fixtures\ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll" exclusion-policy="ALL">
<virtual-property method="getName" serialized-name="mood"/>
</class>
</serializer>
@@ -0,0 +1,5 @@
JMS\Serializer\Tests\Fixtures\ObjectWithVirtualPropertiesAndDuplicatePropNameExcludeAll:
exclusion_policy: all
virtual_properties:
getName:
serialized_name: mood

0 comments on commit 7344ef9

Please sign in to comment.