From 910b85dde0931b67586baa04a9bc63484dacb514 Mon Sep 17 00:00:00 2001 From: MasterFelX Date: Tue, 17 Jun 2025 11:25:29 +0200 Subject: [PATCH] Fix issue of missing nested DTO properties when transforming DTO --- src/SimpleDTO.php | 2 +- tests/Datasets/SimpleInnerDTO.php | 29 +++++++++++++++++++++++ tests/Datasets/SimpleOuterDTO.php | 31 +++++++++++++++++++++++++ tests/Unit/SimpleDTOTest.php | 38 +++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 tests/Datasets/SimpleInnerDTO.php create mode 100644 tests/Datasets/SimpleOuterDTO.php diff --git a/src/SimpleDTO.php b/src/SimpleDTO.php index ac43663..5eb486c 100644 --- a/src/SimpleDTO.php +++ b/src/SimpleDTO.php @@ -499,7 +499,7 @@ private function transformCollectionToArray(Collection $collection): array private function transformDTOToArray(SimpleDTO $dto): array { $result = []; - foreach ($dto->validatedData as $key => $value) { + foreach ($dto->buildDataForExport() as $key => $value) { $result[$key] = $this->isArrayable($value) ? $this->formatArrayableValue($value) : $value; diff --git a/tests/Datasets/SimpleInnerDTO.php b/tests/Datasets/SimpleInnerDTO.php new file mode 100644 index 0000000..c77506f --- /dev/null +++ b/tests/Datasets/SimpleInnerDTO.php @@ -0,0 +1,29 @@ + new StringCast(), + 'number' => new IntegerCast(), + ]; + } +} diff --git a/tests/Datasets/SimpleOuterDTO.php b/tests/Datasets/SimpleOuterDTO.php new file mode 100644 index 0000000..decb1bc --- /dev/null +++ b/tests/Datasets/SimpleOuterDTO.php @@ -0,0 +1,31 @@ + new StringCast(), + 'number' => new IntegerCast(), + 'inner' => new DTOCast(SimpleInnerDTO::class), + ]; + } +} diff --git a/tests/Unit/SimpleDTOTest.php b/tests/Unit/SimpleDTOTest.php index 7266c4d..87856da 100644 --- a/tests/Unit/SimpleDTOTest.php +++ b/tests/Unit/SimpleDTOTest.php @@ -17,6 +17,7 @@ use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleMappedNameDTO; use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleNameDTO; use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleNullableDTO; +use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleOuterDTO; use WendellAdriel\ValidatedDTO\Tests\Datasets\SimpleUserDTO; use WendellAdriel\ValidatedDTO\Tests\Datasets\User; @@ -314,3 +315,40 @@ public function __invoke() {} expect($dto->age)->toBe(20) ->and($dto->toArray())->toBe(['age' => 20, 'doc' => 'test']); }); + +it('checks that update for nested DTO property reflects while converting DTO to array', function () { + $dto = SimpleOuterDTO::fromArray([ + 'name' => 'name', + 'inner' => [ + 'name' => 'inner name', + 'number' => 2, + ], + ]); + + $dto->inner->name = 'updated inner name'; + + expect($dto->inner->name)->toBe('updated inner name') + ->and($dto->toArray())->toBe([ + 'name' => 'name', + 'inner' => [ + 'name' => 'updated inner name', + 'number' => 2, + ], + ]); +}); + +it('checks that update for nested DTO property reflects while converting DTO to json', function () { + $array = [ + 'name' => 'name', + 'inner' => [ + 'name' => 'inner name', + 'number' => 2, + ], + ]; + $dto = SimpleOuterDTO::fromArray($array); + + $dto->inner->name = 'updated inner name'; + + expect($dto->inner->name)->toBe('updated inner name') + ->and($dto->toJson())->toBe(json_encode(['name' => 'name', 'inner' => ['name' => 'updated inner name', 'number' => 2]])); +});