From c2de3054b56999013b0b120e34b3bb6849a52c0a Mon Sep 17 00:00:00 2001 From: Rinsvent Date: Sun, 8 Aug 2021 14:15:13 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Data2DtoConverter.php | 60 ++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/Data2DtoConverter.php b/src/Data2DtoConverter.php index af0c7be..9eaacc6 100644 --- a/src/Data2DtoConverter.php +++ b/src/Data2DtoConverter.php @@ -29,8 +29,7 @@ class Data2DtoConverter // Трансформируем данные $this->processTransformers($property, $value); - // Если значение в $data = null, но поле не может его принять - пропустим - if ($value === null && !$reflectionPropertyType->allowsNull()) { + if ($this->checkNullRule($value, $reflectionPropertyType)) { continue; } // В данных лежит объект, то дальше его не заполняем. Только присваиваем. Например, entity, document @@ -38,25 +37,9 @@ class Data2DtoConverter $property->setValue($object, $value); continue; } - $attributedPropertyClass = null; - $propertyName = $property->getName(); - $propertyExtractor = new PropertyExtractor($property->class, $propertyName); - /** @var DTOMeta $dtoMeta */ - if ($dtoMeta = $propertyExtractor->fetch(DTOMeta::class)) { - $attributedPropertyClass = $dtoMeta->class; - } - // Если массив и есть атрибут с указанием класса, то также преобразуем структуру - if ($propertyType === 'array' && $attributedPropertyClass) { - // Если тип у ДТО - массив, а в значении не массив - пропустим - if (!is_array($value)) { - continue; - } - $tempValue = []; - foreach ($value as $itemValue) { - $tempValue[] = $this->convert($itemValue, $attributedPropertyClass); - } - $value = $tempValue; + if (!$this->transformArray($value, $property)) { + continue; } // Если это class, то рекурсивно заполняем дальше @@ -115,4 +98,41 @@ class Data2DtoConverter $resolver = $storage->get($meta::TYPE); return $resolver->resolve($meta); } + + /** + * Если значение в $data = null, но поле не может его принять - пропустим + */ + private function checkNullRule($value, \ReflectionNamedType $reflectionPropertyType): bool + { + return $value === null && !$reflectionPropertyType->allowsNull(); + } + + private function transformArray(&$value, \ReflectionProperty $property): bool + { + $attributedPropertyClass = null; + $propertyName = $property->getName(); + $propertyExtractor = new PropertyExtractor($property->class, $propertyName); + /** @var DTOMeta $dtoMeta */ + if ($dtoMeta = $propertyExtractor->fetch(DTOMeta::class)) { + $attributedPropertyClass = $dtoMeta->class; + } + + /** @var \ReflectionNamedType $reflectionPropertyType */ + $reflectionPropertyType = $property->getType(); + $propertyType = $reflectionPropertyType->getName(); + + // Если массив и есть атрибут с указанием класса, то также преобразуем структуру + if ($propertyType === 'array' && $attributedPropertyClass) { + // Если тип у ДТО - массив, а в значении не массив - пропустим + if (!is_array($value)) { + return false; + } + $tempValue = []; + foreach ($value as $itemValue) { + $tempValue[] = $this->convert($itemValue, $attributedPropertyClass); + } + $value = $tempValue; + } + return true; + } } \ No newline at end of file