Skip to content

Commit

Permalink
Merge pull request #550 from maennchen/master
Browse files Browse the repository at this point in the history
Generic way to solve setValue on a property which respects its setter
  • Loading branch information
schmittjoh committed May 12, 2016
2 parents 5c03a86 + 028a434 commit 602bd84
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 16 deletions.
8 changes: 1 addition & 7 deletions src/JMS/Serializer/GenericDeserializationVisitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,13 +172,7 @@ public function visitProperty(PropertyMetadata $metadata, $data, Context $contex

$v = $data[$name] !== null ? $this->navigator->accept($data[$name], $metadata->type, $context) : null;

if (null === $metadata->setter) {
$metadata->reflection->setValue($this->currentObject, $v);

return;
}

$this->currentObject->{$metadata->setter}($v);
$metadata->setValue($this->currentObject, $v);
}

public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context)
Expand Down
10 changes: 10 additions & 0 deletions src/JMS/Serializer/Metadata/PropertyMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,16 @@ public function getValue($obj)
return $obj->{$this->getter}();
}

public function setValue($obj, $value)
{
if (null === $this->setter) {
parent::setValue($obj, $value);
return;
}

$obj->{$this->setter}($value);
}

public function setType($type)
{
if (null === self::$typeParser) {
Expand Down
8 changes: 1 addition & 7 deletions src/JMS/Serializer/XmlDeserializationVisitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -281,13 +281,7 @@ public function visitProperty(PropertyMetadata $metadata, $data, Context $contex

$v = $this->navigator->accept($node, $metadata->type, $context);

if (null === $metadata->setter) {
$metadata->reflection->setValue($this->currentObject, $v);

return;
}

$this->currentObject->{$metadata->setter}($v);
$metadata->setValue($this->currentObject, $v);
}

public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context)
Expand Down
3 changes: 1 addition & 2 deletions tests/JMS/Serializer/Tests/Metadata/ClassMetadataTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,7 @@ public function testAccessorTypePublicMethod($property, $getterInit, $setterInit
$this->assertEquals($getterName, $metadata->getter);
$this->assertEquals($setterName, $metadata->setter);

// setter is not supported by setValue(), any idea?
$object->{$metadata->setter}('x');
$metadata->setValue($object, 'x');

$this->assertEquals(sprintf('%1$s:%1$s:x', strtoupper($property)), $metadata->getValue($object));
}
Expand Down

0 comments on commit 602bd84

Please # to comment.