【问题标题】:Return Symfony's validation error as success成功返回 Symfony 的验证错误
【发布时间】:2020-09-12 00:35:26
【问题描述】:

我有一个带有 @UniqueEntity 注释的 Symfony 实体。我使用它,所以我不会在我的数据库中使用相同的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,
        ]);
    }

【问题讨论】:

  • 你能显示代码吗,例如从您想要捕获错误的控制器?
  • @dbrumann 补充说,它是一个简单的控制器,只有一种形式,没有什么复杂的
  • 所有网站都告诉你用户名或邮箱已经被占用,那么用户怎么知道邮箱已经存在呢?
  • @hous 但是,例如,当您在重置密码时输入电子邮件时,出于安全/隐私原因,它不会说明具有该电子邮件地址的帐户是否在数据库中。这就是我想在这里实现的目标。我不希望电子邮件地址所有者以外的其他人知道帐户是否存在/是否订阅了时事通讯。
  • 对于重置密码,是的,我们不会说电子邮件是否存在,但您可以说“如果电子邮件存在,您将收到一封电子邮件......”。

标签: symfony symfony-forms symfony-validator


【解决方案1】:

基本上有两种可能:

  1. 检查插入的电子邮件是否已在执行显式查询的数据库中(保留@UniqueConstraint 注释以保持数据完整性)。
  2. 将实体管理器操作包装在try-catch 块中,如下所示(另请检查this answer

    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
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多