Рефакторинг

master
Rinsvent 3 years ago
parent 3f403ba077
commit c2de3054b5
  1. 58
      src/Data2DtoConverter.php

@ -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,26 +37,10 @@ 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) {
// Если тип у ДТО - массив, а в значении не массив - пропустим
if (!is_array($value)) {
continue; continue;
} }
$tempValue = [];
foreach ($value as $itemValue) {
$tempValue[] = $this->convert($itemValue, $attributedPropertyClass);
}
$value = $tempValue;
}
// Если это class, то рекурсивно заполняем дальше // Если это class, то рекурсивно заполняем дальше
if (class_exists($propertyType)) { if (class_exists($propertyType)) {
@ -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;
}
} }
Loading…
Cancel
Save