|
|
@ -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; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |