twigVariableExtractor = $twigVariableExtractor; $this->varRepository = $varRepository; $this->entityManager = $entityManager; $this->variableRepository = $this->entityManager->getRepository(VariableProject::class); } /** * @param Twig $twig * * @return bool */ public function create(array $variable): ?bool { if (!empty($variable['id'])) { $variableEntity = $this->variableRepository->findOneBy(["id" => $variable['id']]); $name = reset($variable['name']); if (!$this->isNameUsed($name, $variable['id'])) { $variableEntity->setName($name); $this->entityManager->persist($variableEntity); } else { throw new UnprocessableEntityMaestroException($name, "variable", "name"); } } else { $names = array_unique($variable['name']); foreach ($names as $name) { $exist = $this->isNameUsed($name); if (!$exist) { $variableEntity = new VariableProject(); $variableEntity->setName($name) ->setCategorie($variable['categorie']) ->setFieldType($variable['fieldType']); $this->entityManager->persist($variableEntity); } else { throw new UnprocessableEntityMaestroException($name, "variable", "name"); } } } $this->entityManager->flush(); return true; } private function isNameUsed(string $name, ?int $id = null): bool { $variable = $this->variableRepository->findOneBy([ "name" => $name, "deletedAt" => null ]); if (!$variable || ($variable->getId() === $id)) { return false; } return true; } public function delete(int $id) { $variable = $this->variableRepository->findOneBy(["id" => $id]); if (!empty($variable)) { $this->clearVariable($variable); $this->entityManager->remove($variable); $this->entityManager->flush(); return true; } } private function clearVariable(VariableProject $variableProject) { switch ($variableProject->getCategorie()) { case 'variable': foreach ($variableProject->getVariables() as $variable) { $variableProject->removeVariable($variable); $this->entityManager->persist($variable); } break; case 'input': foreach ($variableProject->getInputs() as $input) { $variableProject->removeInput($input); $this->entityManager->persist($input); } break; case 'media': foreach ($variableProject->getExportOptions() as $option) { $variableProject->removeExportOption($option); $this->entityManager->persist($option); } break; case 'option': foreach ($variableProject->getExportMedias() as $media) { $variableProject->removeExportMedia($media); $this->entityManager->persist($media); } break; } } }