Skip to content

Commit 3b16480

Browse files
Merge pull request #108 from MasterFelX/hotfix/nested-transform-issue
Fix issue of missing nested DTO properties when transforming DTO
2 parents d086aa4 + 910b85d commit 3b16480

File tree

4 files changed

+99
-1
lines changed

4 files changed

+99
-1
lines changed

src/SimpleDTO.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@ private function transformCollectionToArray(Collection $collection): array
499499
private function transformDTOToArray(SimpleDTO $dto): array
500500
{
501501
$result = [];
502-
foreach ($dto->validatedData as $key => $value) {
502+
foreach ($dto->buildDataForExport() as $key => $value) {
503503
$result[$key] = $this->isArrayable($value)
504504
? $this->formatArrayableValue($value)
505505
: $value;

tests/Datasets/SimpleInnerDTO.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WendellAdriel\ValidatedDTO\Tests\Datasets;
6+
7+
use WendellAdriel\ValidatedDTO\Casting\IntegerCast;
8+
use WendellAdriel\ValidatedDTO\Casting\StringCast;
9+
use WendellAdriel\ValidatedDTO\SimpleDTO;
10+
11+
class SimpleInnerDTO extends SimpleDTO
12+
{
13+
public string $name;
14+
15+
public int $number;
16+
17+
protected function defaults(): array
18+
{
19+
return [];
20+
}
21+
22+
protected function casts(): array
23+
{
24+
return [
25+
'name' => new StringCast(),
26+
'number' => new IntegerCast(),
27+
];
28+
}
29+
}

tests/Datasets/SimpleOuterDTO.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WendellAdriel\ValidatedDTO\Tests\Datasets;
6+
7+
use WendellAdriel\ValidatedDTO\Casting\DTOCast;
8+
use WendellAdriel\ValidatedDTO\Casting\IntegerCast;
9+
use WendellAdriel\ValidatedDTO\Casting\StringCast;
10+
use WendellAdriel\ValidatedDTO\SimpleDTO;
11+
12+
class SimpleOuterDTO extends SimpleDTO
13+
{
14+
public string $name;
15+
16+
public SimpleInnerDTO $inner;
17+
18+
protected function defaults(): array
19+
{
20+
return [];
21+
}
22+
23+
protected function casts(): array
24+
{
25+
return [
26+
'name' => new StringCast(),
27+
'number' => new IntegerCast(),
28+
'inner' => new DTOCast(SimpleInnerDTO::class),
29+
];
30+
}
31+
}

tests/Unit/SimpleDTOTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleMappedNameDTO;
1818
use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleNameDTO;
1919
use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleNullableDTO;
20+
use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleOuterDTO;
2021
use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleUserDTO;
2122
use WendellAdriel\ValidatedDTO\Tests\Datasets\User;
2223

@@ -314,3 +315,40 @@ public function __invoke() {}
314315
expect($dto->age)->toBe(20)
315316
->and($dto->toArray())->toBe(['age' => 20, 'doc' => 'test']);
316317
});
318+
319+
it('checks that update for nested DTO property reflects while converting DTO to array', function () {
320+
$dto = SimpleOuterDTO::fromArray([
321+
'name' => 'name',
322+
'inner' => [
323+
'name' => 'inner name',
324+
'number' => 2,
325+
],
326+
]);
327+
328+
$dto->inner->name = 'updated inner name';
329+
330+
expect($dto->inner->name)->toBe('updated inner name')
331+
->and($dto->toArray())->toBe([
332+
'name' => 'name',
333+
'inner' => [
334+
'name' => 'updated inner name',
335+
'number' => 2,
336+
],
337+
]);
338+
});
339+
340+
it('checks that update for nested DTO property reflects while converting DTO to json', function () {
341+
$array = [
342+
'name' => 'name',
343+
'inner' => [
344+
'name' => 'inner name',
345+
'number' => 2,
346+
],
347+
];
348+
$dto = SimpleOuterDTO::fromArray($array);
349+
350+
$dto->inner->name = 'updated inner name';
351+
352+
expect($dto->inner->name)->toBe('updated inner name')
353+
->and($dto->toJson())->toBe(json_encode(['name' => 'name', 'inner' => ['name' => 'updated inner name', 'number' => 2]]));
354+
});

0 commit comments

Comments
 (0)