diff --git a/DataLoader/BlackMagic/BlackMagicEntityCodeGenerator.php b/DataLoader/BlackMagic/BlackMagicEntityCodeGenerator.php index 4856d8d..4b0fd9b 100644 --- a/DataLoader/BlackMagic/BlackMagicEntityCodeGenerator.php +++ b/DataLoader/BlackMagic/BlackMagicEntityCodeGenerator.php @@ -53,12 +53,21 @@ public function processMapping( /** @var array $walkedFiles */ $walkedFiles = [$filePath => true]; + + /** @var string $safeFilePath */ + $safeFilePath = $filePath; do { + if (!file_exists($filePath)) { + $filePath = $safeFilePath; + break; + } + /** @var string $entityPHP */ $entityPHP = file_get_contents($filePath); if (1 === preg_match("#\/\*\* \@addiks-original-file ([^\*]*) \*\/#is", $entityPHP, $matches)) { + $safeFilePath = $filePath; $filePath = trim($matches[1]); if (isset($walkedFiles[$filePath])) { diff --git a/Mapping/ObjectMapping.php b/Mapping/ObjectMapping.php index 435d20f..89016c6 100644 --- a/Mapping/ObjectMapping.php +++ b/Mapping/ObjectMapping.php @@ -24,6 +24,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface; use Doctrine\DBAL\Types\Type; use Doctrine\DBAL\Connection; +use BackedEnum; +use UnitEnum; final class ObjectMapping implements MappingInterface { @@ -163,6 +165,9 @@ public function resolveValue( /** @var object|null $object */ $object = null; + /** @var string $columnName */ + $columnName = $this->column?->getName() ?? ''; + # During creation of an object, the class-name is on the top of that creation stack $context->pushOnObjectHydrationStack($this->className); @@ -179,9 +184,6 @@ public function resolveValue( /** @var Type $type */ $type = $this->column->getType(); - /** @var string $columnName */ - $columnName = $this->column->getName(); - if (array_key_exists($columnName, $dataFromAdditionalColumns)) { /** @var Connection $connection */ $connection = $context->getEntityManager()->getConnection(); @@ -201,6 +203,13 @@ public function resolveValue( $context, $factoryData ); + + } elseif (is_a($this->className, BackedEnum::class, true)) { + $object = call_user_func($this->className . '::from', $dataFromAdditionalColumns[$columnName]); +# $object = {$this->className}::from($dataFromAdditionalColumns[$columnName]); + + } elseif (is_a($this->className, UnitEnum::class, true)) { + $object = constant(sprintf('%s::%s', $this->className, $dataFromAdditionalColumns[$columnName])); } else { if ($reflectionClass->isInstantiable()) { @@ -312,14 +321,14 @@ public function revertValue( $data = array_merge($data, $fieldData); } - if ($this->serializer instanceof CallDefinitionInterface) { - /** @var string $columnName */ - $columnName = ''; + /** @var string $columnName */ + $columnName = ''; - if ($this->column instanceof Column) { - $columnName = $this->column->getName(); - } + if ($this->column instanceof Column) { + $columnName = $this->column->getName(); + } + if ($this->serializer instanceof CallDefinitionInterface) { $data[$columnName] = $this->serializer->execute( $context, array_merge($data, ['' => $valueFromEntityField]) @@ -337,6 +346,12 @@ public function revertValue( $connection->getDatabasePlatform() ); } + + } elseif (is_a($this->className, BackedEnum::class, true)) { + $data[$columnName] = $valueFromEntityField->value; + + } elseif (is_a($this->className, UnitEnum::class, true)) { + $data[$columnName] = $valueFromEntityField->name; } $context->popFromObjectHydrationStack(); @@ -367,6 +382,12 @@ public function wakeUpMapping(ContainerInterface $container): void if ($this->serializer instanceof CallDefinitionInterface) { $this->serializer->wakeUpCall($container); } + + foreach ($this->fieldMappings as $fieldName => $fieldMapping) { + /** @var MappingInterface $fieldMapping */ + + $fieldMapping->wakeUpMapping($container); + } } }