2016-04-21 74 views
1

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

详细

我使用Symfony的定制约束@UniqueEntityhttp://symfony.com/doc/current/reference/constraints/UniqueEntity.html)断言保存实体时,一些数据不重复。

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

我似乎无法找到任何有关如何覆盖验证响应的文档。

非常感谢您的任何建议。

回答

1

正好赶上例外:

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); 
    } 
} 
+0

谢谢,这也是一个好主意,比听众更简单!我会尝试。附:代码中存在拼写错误,“重复名称”后缺少引号。 –

+0

错字修正,谢谢! –

+0

谢谢你,你的解决方案工作正常,但我不得不删除'@ UniqueEntity'注释让正确的异常通过。所以假设你不使用'@ UniqueEntity'注解,这是最好的答案。您可能需要相应地编辑您的答案。 –

2

也许你可以创建一个Listener到事件:kernel.exception

,然后你会碰到这样的:在控制器

<?php 

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

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

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

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