Вернуть ошибку проверки Symfony как успешную - PullRequest
0 голосов
/ 25 мая 2020

У меня есть сущность Symfony с аннотацией @UniqueEntity. Я использую его, чтобы не получать двойные записи в моей базе данных с тем же email, но я не хочу возвращать пользователю, что электронное письмо уже находится в базе данных (из соображений конфиденциальности).

Как я могу использовать @UniqueEntity, но поймать ошибку и вернуть пользователю сообщение об успешном завершении?

Код контроллера:

    public function register(Request $request, EntityManagerInterface $entityManager, TranslatorInterface $translator): Response
    {
        $success = false;

        $newsletter = new Newsletter();
        $form = $this->createForm(NewsletterType::class, $newsletter);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
                $newsletter = $form->getData();

                $entityManager->persist($newsletter);
                $entityManager->flush();

                $this->addFlash('success', $translator->trans('newsletter.signed_up'));

                return $this->redirectToRoute('landing');
        }

        return $this->render('landing/landing.html.twig', [
            'newsletter_form' => $form->createView(),
            'newsletter_success' => $success,
        ]);
    }

1 Ответ

0 голосов
/ 26 мая 2020

По сути, две возможности:

  1. Проверить, есть ли уже вставленное электронное письмо в БД, выполняя явный запрос (сохраните аннотацию @UniqueConstraint для сохранения целостности данных).
  2. Оберните операцию диспетчера сущностей в блок try-catch следующим образом (проверьте также этот ответ )

    try {
      $entityManager->persist($newsletter);
      $entityManager->flush();
    } catch (UniqueConstraintViolationException $e) {
      // you can check if the exception is raised by email field, somehow, or just "mask" with a general error
    }
    
...