. */ namespace App\Serializer; use App\Entity\Base\AbstractStructuralDBElement; use App\Form\Type\StructuralEntityType; use App\Repository\StructuralDBElementRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Serializer\Normalizer\CacheableSupportsMethodInterface; use Symfony\Component\Serializer\Normalizer\ContextAwareDenormalizerInterface; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; class StructuralElementFromNameDenormalizer implements DenormalizerInterface, CacheableSupportsMethodInterface { private EntityManagerInterface $em; public function __construct(EntityManagerInterface $em) { $this->em = $em; } public function supportsDenormalization($data, string $type, string $format = null): bool { return is_string($data) && is_subclass_of($type, AbstractStructuralDBElement::class); } public function denormalize($data, string $type, string $format = null, array $context = []) { //Retrieve the repository for the given type /** @var StructuralDBElementRepository $repo */ $repo = $this->em->getRepository($type); $path_delimiter = $context['path_delimiter'] ?? '->'; if ($context['create_unknown_datastructures'] ?? false) { $elements = $repo->getNewEntityFromPath($data, $path_delimiter); //Persist all new elements foreach ($elements as $element) { $this->em->persist($element); } if (empty($elements)) { return null; } return end($elements); } $elements = $repo->getEntityByPath($data, $path_delimiter); if (empty($elements)) { return null; } return end($elements); } public function hasCacheableSupportsMethod(): bool { //Must be false, because we do a is_string check on data in supportsDenormalization return false; } }