Рефакторинг

This commit is contained in:
Rinsvent 2021-08-08 14:15:13 +07:00
parent 3f403ba077
commit c2de3054b5

View File

@ -29,8 +29,7 @@ class Data2DtoConverter
// Трансформируем данные // Трансформируем данные
$this->processTransformers($property, $value); $this->processTransformers($property, $value);
// Если значение в $data = null, но поле не может его принять - пропустим if ($this->checkNullRule($value, $reflectionPropertyType)) {
if ($value === null && !$reflectionPropertyType->allowsNull()) {
continue; continue;
} }
// В данных лежит объект, то дальше его не заполняем. Только присваиваем. Например, entity, document // В данных лежит объект, то дальше его не заполняем. Только присваиваем. Например, entity, document
@ -38,25 +37,9 @@ class Data2DtoConverter
$property->setValue($object, $value); $property->setValue($object, $value);
continue; 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 (!$this->transformArray($value, $property)) {
if ($propertyType === 'array' && $attributedPropertyClass) { continue;
// Если тип у ДТО - массив, а в значении не массив - пропустим
if (!is_array($value)) {
continue;
}
$tempValue = [];
foreach ($value as $itemValue) {
$tempValue[] = $this->convert($itemValue, $attributedPropertyClass);
}
$value = $tempValue;
} }
// Если это class, то рекурсивно заполняем дальше // Если это class, то рекурсивно заполняем дальше
@ -115,4 +98,41 @@ class Data2DtoConverter
$resolver = $storage->get($meta::TYPE); $resolver = $storage->get($meta::TYPE);
return $resolver->resolve($meta); 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;
}
} }