Рефакторинг

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);
// Если значение в $data = null, но поле не может его принять - пропустим
if ($value === null && !$reflectionPropertyType->allowsNull()) {
if ($this->checkNullRule($value, $reflectionPropertyType)) {
continue;
}
// В данных лежит объект, то дальше его не заполняем. Только присваиваем. Например, entity, document
@ -38,26 +37,10 @@ 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)) {
if (!$this->transformArray($value, $property)) {
continue;
}
$tempValue = [];
foreach ($value as $itemValue) {
$tempValue[] = $this->convert($itemValue, $attributedPropertyClass);
}
$value = $tempValue;
}
// Если это class, то рекурсивно заполняем дальше
if (class_exists($propertyType)) {
@ -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;
}
}