Skip to content

Commit 867957c

Browse files
Jakob Linskesederjaylinski
authored andcommitted
Add array-key support for ArrayBinding
Resolves #52, #53
1 parent c70c829 commit 867957c

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

.php-cs-fixer.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
->append(['.php-cs-fixer.php']);
77

88
$rules = [
9-
'@Symfony' => true,
10-
'phpdoc_no_empty_return' => false,
11-
'yoda_style' => false,
12-
'binary_operator_spaces' => [
9+
'@Symfony' => true,
10+
'global_namespace_import' => false,
11+
'phpdoc_no_empty_return' => false,
12+
'yoda_style' => false,
13+
'binary_operator_spaces' => [
1314
'operators' => [
1415
'=>' => 'align',
1516
'=' => 'align',

src/Bindings/ArrayBinding.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public function bind(JsonDecoder $jsonDecoder, ?array $jsonData, Property $prope
1818
$values = [];
1919

2020
if (is_array($data)) {
21-
foreach ($data as $item) {
22-
$values[] = $jsonDecoder->decodeArray($item, $this->type);
21+
foreach ($data as $key => $item) {
22+
$values[$key] = $jsonDecoder->decodeArray($item, $this->type);
2323
}
2424

2525
$property->set($values);

tests/Bindings/ArrayBindingTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,36 @@ public function itBindsAnArray()
4141
$this->assertEquals('City 2', $person->address()[1]->city());
4242
}
4343

44+
/** @test */
45+
public function itBindsAnArrayPreservingKeys()
46+
{
47+
$binding = new ArrayBinding('address', 'addresses', Address::class);
48+
$person = new Person();
49+
$property = Property::create($person, 'address');
50+
51+
$jsonData = [
52+
'addresses' => [
53+
'address key #1' => [
54+
'street' => 'Street 1',
55+
'city' => 'City 1',
56+
],
57+
'address key #2' => [
58+
'street' => 'Street 2',
59+
'city' => 'City 2',
60+
],
61+
],
62+
];
63+
64+
$binding->bind(new JsonDecoder(), $jsonData, $property);
65+
66+
$this->assertIsArray($person->address());
67+
$this->assertCount(2, $person->address());
68+
$this->assertEquals('Street 1', $person->address()['address key #1']->street());
69+
$this->assertEquals('City 1', $person->address()['address key #1']->city());
70+
$this->assertEquals('Street 2', $person->address()['address key #2']->street());
71+
$this->assertEquals('City 2', $person->address()['address key #2']->city());
72+
}
73+
4474
/** @test */
4575
public function itSkipsANotAvailableField()
4676
{

0 commit comments

Comments
 (0)