8000 [PropertyAccess] Fix regression · symfony/symfony@2b30d48 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2b30d48

Browse files
[PropertyAccess] Fix regression
1 parent 019e316 commit 2b30d48

File tree

3 files changed

+188
-0
lines changed

3 files changed

+188
-0
lines changed

src/Symfony/Component/PropertyAccess/PropertyAccessor.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ public function setValue(&$objectOrArray, $propertyPath, $value)
181181
if ($propertyPath->isIndex($i)) {
182182
if ($overwrite = !isset($zval[self::REF])) {
183183
$ref = &$zval[self::REF];
184+
$ref = $zval[self::VALUE];
184185
}
185186
$this->writeIndex($zval, $property, $value);
186187
if ($overwrite) {
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\PropertyAccess\Tests\Fixtures;
13+
14+
class TestClass
15+
{
16+
public $publicProperty;
17+
protected $protectedProperty;
18+
private $privateProperty;
19+
20+
private $publicAccessor;
21+
private $publicMethodAccessor;
22+
private $publicGetSetter;
23+
private $publicAccessorWithDefaultValue;
24+
private $publicAccessorWithRequiredAndDefaultValue;
25+
private $publicAccessorWithMoreRequiredParameters;
26+
private $publicIsAccessor;
27+
private $publicHasAccessor;
28+
private $publicGetter;
29+
30+
public function __construct($value)
31+
{
32+
$this->publicProperty = $value;
33+
$this->publicAccessor = $value;
34+
$this->publicMethodAccessor = $value;
35+
$this->publicGetSetter = $value;
36+
$this->publicAccessorWithDefaultValue = $value;
37+
$this->publicAccessorWithRequiredAndDefaultValue = $value;
38+
$this->publicAccessorWithMoreRequiredParameters = $value;
39+
$this->publicIsAccessor = $value;
40+
$this->publicHasAccessor = $value;
41+
$this->publicGetter = $value;
42+
}
43+
44+
public function setPublicAccessor($value)
45+
{
46+
$this->publicAccessor = $value;
47+
}
48+
49+
public function setPublicAccessorWithDefaultValue($value = null)
50+
{
51+
$this->publicAccessorWithDefaultValue = $value;
52+
}
53+
54+
public function setPublicAccessorWithRequiredAndDefaultValue($value, $optional = null)
55+
{
56+
$this->publicAccessorWithRequiredAndDefaultValue = $value;
57+
}
58+
59+
public function setPublicAccessorWithMoreRequiredParameters($value, $needed)
60+
{
61+
$this->publicAccessorWithMoreRequiredParameters = $value;
62+
}
63+
64+
public function getPublicAccessor()
65+
{
66+
return $this->publicAccessor;
67+
}
68+
69+
public function getPublicAccessorWithDefaultValue()
70+
{
71+
return $this->publicAccessorWithDefaultValue;
72+
}
73+
74+
public function getPublicAccessorWithRequiredAndDefaultValue()
75+
{
76+
return $this->publicAccessorWithRequiredAndDefaultValue;
77+
}
78+
79+
public function getPublicAccessorWithMoreRequiredParameters()
80+
{
81+
return $this->publicAccessorWithMoreRequiredParameters;
82+
}
83+
84+
public function setPublicIsAccessor($value)
85+
{
86+
$this->publicIsAccessor = $value;
87+
}
88+
89+
public function isPublicIsAccessor()
90+
{
91+
return $this->publicIsAccessor;
92+
}
93+
94+
public function setPublicHasAccessor($value)
95+
{
96+
$this->publicHasAccessor = $value;
97+
}
98+
99+
public function hasPublicHasAccessor()
100+
{
101+
return $this->publicHasAccessor;
102+
}
103+
104+
public function publicGetSetter($value = null)
105+
{
106+
if (null !== $value) {
107+
$this->publicGetSetter = $value;
108+
}
109+
110+
return $this->publicGetSetter;
111+
}
112+
113+
public function getPublicMethodMutator()
114+
{
115+
return $this->publicGetSetter;
116+
}
117+
118+
protected function setProtectedAccessor($value)
119+
{
120+
}
121+
122+
protected function getProtectedAccessor()
123+
{
124+
return 'foobar';
125+
}
126+
127+
protected function setProtectedIsAccessor($value)
128+
{
129+
}
130+
131+
protected function isProtectedIsAccessor()
132+
{
133+
return 'foobar';
134+
}
135+
136+
protected function setProtectedHasAccessor($value)
137+
{
138+
}
139+
140+
protected function hasProtectedHasAccessor()
141+
{
142+
return 'foobar';
143+
}
144+
145+
private function setPrivateAccessor($value)
146+
{
147+
}
148+
149+
private function getPrivateAccessor()
150+
{
151+
return 'foobar';
152+
}
153+
154+
private function setPrivateIsAccessor($value)
155+
{
156+
}
157+
158+
private function isPrivateIsAccessor()
159+
{
160+
return 'foobar';
161+
}
162+
163+
private function setPrivateHasAccessor($value)
164+
{
165+
}
166+
167+
private function hasPrivateHasAccessor()
168+
{
169+
return 'foobar';
170+
}
171+
172+
public function getPublicGetter()
173+
{
174+
return $this->publicGetter;
175+
}
176+
}

src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\PropertyAccess\Tests\Fixtures\Author;
1616
use Symfony\Component\PropertyAccess\Tests\Fixtures\Magician;
1717
use Symfony\Component\PropertyAccess\Tests\Fixtures\MagicianCall;
18+
use Symfony\Component\PropertyAccess\Tests\Fixtures\TestClass;
1819
use Symfony\Component\PropertyAccess\Tests\Fixtures\Ticket5775Object;
1920
use Symfony\Component\PropertyAccess\Tests\Fixtures\TypeHinted;
2021

@@ -422,4 +423,14 @@ public function testSetTypeHint()
422423
$this->propertyAccessor->setValue($object, 'date', $date);
423424
$this->assertSame($date, $object->getDate());
424425
}
426+
427+
public function testArrayNotBeeingOverwritten()
428+
{
429+
$value = array('value1' => 'foo', 'value2' => 'bar');
430+
$object = new TestClass($value);
431+
432+
$this->propertyAccessor->setValue($object, 'publicAccessor[value2]', 'baz');
433+
$this->assertSame('baz', $this->propertyAccessor->getValue($object, 'publicAccessor[value2]'));
434+
$this->assertSame(array('value1' => 'foo', 'value2' => 'baz'), $object->getPublicAccessor());
435+
}
425436
}

0 commit comments

Comments
 (0)
0