【问题标题】:Set http code for Symfony constraint validation failure为 Symfony 约束验证失败设置 http 代码
【发布时间】:2016-04-21 13:46:15
【问题描述】:

简而言之:当实体保存的约束失败时,如何设置特定的 http 错误代码,而不是通用的 500?

详情

我正在使用 Symfony 自定义约束 @UniqueEntity (http://symfony.com/doc/current/reference/constraints/UniqueEntity.html) 来断言保存实体时某些数据不会重复。

如果此约束检查导致违规,我会得到一个 500 http 代码,而其他代码可能更合适,例如409 - 冲突 (https://httpstatuses.com/409)。

我似乎找不到任何关于如何覆盖验证响应的文档。

提前感谢您的任何建议。

【问题讨论】:

  • 你找到解决 UniqueEntity 约束的方法了吗?
  • @PierrickMartellière 不,但您可以使用这样的实际约束 * @ORM\Table(name="company", uniqueConstraints={ * @ORM\UniqueConstraint(name="code_idx", columns={ “代码”}) * })
  • 这不是和@UniqueEntity() 很像吗?
  • @PierrickMartellière 是的,但会引发正确的异常。在下面接受的答案中查看我的最后一条评论。
  • 是的,我向您指出了该评论以解释我必须使用不同注释的原因。希望这会有所帮助。

标签: php rest symfony http doctrine


【解决方案1】:

也许您可以为该事件创建一个Listenerkernel.exception

然后你会得到类似的东西:

<?php

public function onKernelException(GetResponseForExceptionEvent $event)
{
      $e = $event->getException();

      if ($e instanceof NameOfTheException) {
            // logic here

            return (new Response())
                  ->setStatusCode(409)
            ;
      }
}

【讨论】:

  • 谢谢,这是一个创造性的解决方法,我会尝试它,它可能会解决我的需求。不幸的是,我觉得这不是“正确”的答案(也许没有)。
【解决方案2】:

只需在控制器中捕获异常:

public function saveAction()
{
    try {
       $entity = new Entity('duplicate name');

       $this->entityManager->persist($entity);
       $this->entityManager->flush();

       return new Response();
    } catch(UniqueConstraintViolationException $e) {
       return new Response('Entity with same name already exists', Response::HTTP_CONFLICT);
    } catch (\Exception $e) {
       return new Response('Internal error', Response::HTTP_INTERNAL_SERVER_ERROR);
    }
}

【讨论】:

  • 谢谢,这也是个好主意,比听者还简单!我会尝试。附言代码中有错字,“重复名称”后缺少引号。
  • 谢谢,您的解决方案运行良好,但我必须删除 @UniqueEntity 注释才能让正确的异常通过。因此,假设您不使用 @UniqueEntity 注释,这是最好的答案。您可能需要相应地编辑您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 2015-05-08
  • 2021-03-10
  • 1970-01-01
  • 2012-11-13
  • 2012-08-17
  • 1970-01-01
相关资源
最近更新 更多