Skip to content

Commit a5ccc56

Browse files
authored
Merge pull request #42 from drieschel/direct_assign_multidimensional_array_for_primitives
Improvement: Assign multidimensional arrays for primitives directly
2 parents 86818f4 + 13d3f94 commit a5ccc56

File tree

4 files changed

+61
-24
lines changed

4 files changed

+61
-24
lines changed

src/SerializerGenerator.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ private function generateCodeForArray(
224224

225225
switch ($subType) {
226226
case $subType instanceof PropertyTypePrimitive:
227-
case $subType instanceof PropertyTypeArray && $subType->getSubType() instanceof PropertyTypePrimitive:
227+
case $subType instanceof PropertyTypeArray && self::isArrayForPrimitive($subType):
228228
case $subType instanceof PropertyTypeUnknown && $this->configuration->shouldAllowGenericArrays():
229229
return $this->templating->renderArrayAssign($arrayPath, $modelPath);
230230

@@ -254,4 +254,16 @@ private function generateCodeForArray(
254254

255255
return $this->templating->renderLoopArray($arrayPath, $modelPath, $index, $innerCode);
256256
}
257+
258+
private static function isArrayForPrimitive(PropertyTypeArray $type): bool
259+
{
260+
do {
261+
$type = $type->getSubType();
262+
if ($type instanceof PropertyTypePrimitive) {
263+
return true;
264+
}
265+
} while ($type instanceof PropertyTypeArray);
266+
267+
return false;
268+
}
257269
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Liip\Serializer\Fixtures;
6+
7+
use JMS\Serializer\Annotation as Serializer;
8+
9+
class MultidimensionalArrayForPrimitive
10+
{
11+
/**
12+
* @Serializer\Type("array<int, array<int>>")
13+
*/
14+
public array $twoDims = [];
15+
16+
/**
17+
* @Serializer\Type("array<int, array<int, array<int, array<int, array<int>>>>>")
18+
*/
19+
public array $fiveDims = [];
20+
21+
/**
22+
* @Serializer\Type("array<string, array<int>>")
23+
*/
24+
public array $mapOfLists = [];
25+
26+
/**
27+
* @Serializer\Type("array<int, array<string, array<int>>>")
28+
*/
29+
public array $listOfMapOfLists = [];
30+
}

tests/Fixtures/PrimitiveArraySubType.php

Lines changed: 0 additions & 15 deletions
This file was deleted.

tests/Unit/SerializerGeneratorTest.php

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
use Tests\Liip\Serializer\Fixtures\Inheritance;
1818
use Tests\Liip\Serializer\Fixtures\ListModel;
1919
use Tests\Liip\Serializer\Fixtures\Model;
20+
use Tests\Liip\Serializer\Fixtures\MultidimensionalArrayForPrimitive;
2021
use Tests\Liip\Serializer\Fixtures\Nested;
2122
use Tests\Liip\Serializer\Fixtures\PostDeserialize;
22-
use Tests\Liip\Serializer\Fixtures\PrimitiveArraySubType;
2323
use Tests\Liip\Serializer\Fixtures\PrivateProperty;
2424
use Tests\Liip\Serializer\Fixtures\RecursionModel;
2525
use Tests\Liip\Serializer\Fixtures\UnknownArraySubType;
@@ -143,17 +143,27 @@ public function testArraysWithUnknownSubType(): void
143143
self::assertSame($expected, $data);
144144
}
145145

146-
public function testArraysWithPrimitiveSubType(): void
146+
public function testMultidimensionalArraysForPrimitives(): void
147147
{
148-
$functionName = 'serialize_Tests_Liip_Serializer_Fixtures_PrimitiveArraySubType';
149-
self::generateSerializers(self::$metadataBuilder, PrimitiveArraySubType::class, [$functionName], ['']);
148+
$functionName = 'serialize_Tests_Liip_Serializer_Fixtures_MultidimensionalArrayForPrimitive';
149+
self::generateSerializers(self::$metadataBuilder, MultidimensionalArrayForPrimitive::class, [$functionName], ['']);
150150

151-
$subject = new PrimitiveArraySubType();
152-
$lists = [[1, 2, 3], [4, 5, 6]];
153-
$subject->primitivesLists = $lists;
151+
$subject = new MultidimensionalArrayForPrimitive();
152+
$twoDims = [0 => [0], 1 => [1]];
153+
$fiveDims = [0 => [0 => [0 => [0 => [2]]]], 1 => [3 => [0 => [0 => [3]]]]];
154+
$mapOfLists = ['foo' => [0], 'bar' => 1];
155+
$listOfMapOfLists = [0 => ['m00' => [0 => [0], 1 => [1]], 'm01' => [0 => [0]]], 1 => ['m10' => [0 => [42]]]];
156+
157+
$subject->twoDims = $twoDims;
158+
$subject->fiveDims = $fiveDims;
159+
$subject->mapOfLists = $mapOfLists;
160+
$subject->listOfMapOfLists = $listOfMapOfLists;
154161

155162
$expected = [
156-
'primitives_lists' => $lists,
163+
'two_dims' => $twoDims,
164+
'five_dims' => $fiveDims,
165+
'map_of_lists' => $mapOfLists,
166+
'list_of_map_of_lists' => $listOfMapOfLists,
157167
];
158168

159169
$data = $functionName($subject);

0 commit comments

Comments
 (0)