Skip to content

Commit 5c052bb

Browse files
committed
* Composed object values aren't set properly (instead the incoming raw array was set as property value)
1 parent bc569e3 commit 5c052bb

File tree

6 files changed

+42
-19
lines changed

6 files changed

+42
-19
lines changed

src/PropertyProcessor/ComposedValue/AbstractComposedValueProcessor.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ protected function generateValidators(PropertyInterface $property, array $proper
6666
'viewHelper' => new RenderHelper(),
6767
'availableAmount' => $availableAmount,
6868
'composedValueValidation' => $this->getComposedValueValidation($availableAmount),
69+
// if the property is a composed property the resulting value of a validation must be proposed to be the
70+
// final value after the validations (eg. object instantiations may be performed). Otherwise (eg. a
71+
// NotProcessor) the value must be proposed before the validation
72+
'postPropose' => $this instanceof ComposedPropertiesInterface,
6973
'onlyForDefinedValues' => $propertyData['onlyForDefinedValues'] &&
7074
$this instanceof ComposedPropertiesInterface,
7175
]

src/PropertyProcessor/ComposedValue/IfProcessor.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,4 @@ protected function generateValidators(PropertyInterface $property, array $proper
8181

8282
parent::generateValidators($property, $propertyData);
8383
}
84-
85-
/**
86-
* @inheritdoc
87-
*/
88-
protected function getComposedValueValidation(int $composedElements): string
89-
{
90-
return '$succeededCompositionElements === 0';
91-
}
9284
}

src/Templates/Model.phptpl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ class {{ class }}
3434
*/
3535
public function __construct(array $modelData)
3636
{
37-
$rawValue = $modelData;
37+
{% if baseValidators %}
38+
$value = $modelData;
39+
{% endif %}
3840

3941
{% foreach baseValidators as validator %}
4042
if ({{ validator.getCheck() }}) {
@@ -100,7 +102,7 @@ class {{ class }}
100102
*/
101103
protected function process{{ viewHelper.ucfirst(property.getAttribute()) }}(array $modelData): void
102104
{
103-
$value = $rawValue = $modelData['{{ property.getName() }}'] ?? $this->{{ property.getAttribute() }};
105+
$value = $modelData['{{ property.getName() }}'] ?? $this->{{ property.getAttribute() }};
104106

105107
{{ viewHelper.resolvePropertyDecorator(property) }}
106108

src/Templates/Validator/ComposedItem.phptpl

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
{%if onlyForDefinedValues %}
22
$value !== null &&
33
{% endif %}
4-
(function ($value) use (&$modelData) {
4+
(function (&$value) use (&$modelData) {
55
$succeededCompositionElements = {{ availableAmount }};
66
$originalModelData = $value;
7+
$proposedValue = null;
8+
79
{% foreach properties as property %}
810
try {
11+
{% if not postPropose %}
12+
$proposedValue = $proposedValue ?? $value;
13+
{% endif %}
14+
915
{{ viewHelper.resolvePropertyDecorator(property) }}
1016

1117
{% foreach property.getOrderedValidators() as validator %}
1218
if ({{ validator.getCheck() }}) {
1319
throw new {{ viewHelper.getSimpleClassName(validator.getExceptionClass()) }}('{{ validator.getExceptionMessage() }}');
1420
}
1521
{% endforeach %}
22+
23+
{% if postPropose %}
24+
$proposedValue = $proposedValue ?? $value;
25+
{% endif %}
1626
} catch (\Exception $e) {
1727
{% foreach property.getAffectedObjectProperties() as affectedObjectProperty %}
1828
unset($modelData['{{ affectedObjectProperty.getName() }}']);
@@ -23,5 +33,7 @@
2333
$value = $originalModelData;
2434
{% endforeach %}
2535

36+
$value = $proposedValue;
37+
2638
return !({{ composedValueValidation }});
27-
})($rawValue)
39+
})($value)

src/Templates/Validator/ConditionalComposedItem.phptpl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{%if onlyForDefinedValues %}
22
$value !== null &&
33
{% endif %}
4-
(function ($value) use (&$modelData) {
4+
(function (&$value) use (&$modelData) {
55
$originalModelData = $value;
6-
$ifValid = true;
6+
$ifValid = true;
77

88
try {
99
{{ viewHelper.resolvePropertyDecorator(ifProperty) }}
@@ -41,4 +41,4 @@
4141
}
4242

4343
return false;
44-
})($rawValue)
44+
})($value)

tests/ComposedValue/ComposedOneOfTest.php

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,27 +203,40 @@ public function invalidExtendedPropertyDataProvider(): array
203203
}
204204

205205
/**
206-
* @dataProvider objectPropertyWithReferencedSchemaDataProvider
206+
* @dataProvider composedPropertyWithReferencedSchemaDataProvider
207207
*
208208
* @param $propertyValue
209209
*/
210-
public function testMatchingObjectPropertyWithReferencedSchemaIsValid($propertyValue): void
210+
public function testMatchingComposedPropertyWithReferencedSchemaIsValid($propertyValue): void
211211
{
212212
$className = $this->generateObjectFromFile('ReferencedObjectSchema.json');
213213

214214
$object = new $className(['property' => $propertyValue]);
215215
$this->assertSame($propertyValue, $object->getProperty());
216216
}
217217

218-
public function objectPropertyWithReferencedSchemaDataProvider(): array
218+
public function composedPropertyWithReferencedSchemaDataProvider(): array
219219
{
220220
return [
221221
'null' => [null],
222222
'string matching required length' => ['Hanne'],
223-
'Matching object' => [['name' => 'Ha', 'age' => 42]],
224223
];
225224
}
226225

226+
/**
227+
* @param $propertyValue
228+
*/
229+
public function testMatchingObjectPropertyWithReferencedSchemaIsValid(): void
230+
{
231+
$className = $this->generateObjectFromFile('ReferencedObjectSchema.json');
232+
233+
$object = new $className(['property' => ['name' => 'Ha', 'age' => 42]]);
234+
235+
$this->assertTrue(is_object($object->getProperty()));
236+
$this->assertSame('Ha', $object->getProperty()->getName());
237+
$this->assertSame(42, $object->getProperty()->getAge());
238+
}
239+
227240
/**
228241
* @dataProvider invalidObjectPropertyWithReferencedSchemaDataProvider
229242
*

0 commit comments

Comments
 (0)