Symfony:处理Doctrine关系中的EntityNotFoundException

3
当我在Twig中尝试显示一个相关对象时,如果该关系不存在,因为ID在父实体中,但相关实体不在当前数据库中,Symfony会抛出500错误。
// EntityNotFoundException Twig_Error_Runtime 渲染模板时发生了异常(“类型为'App\Entity\Location'的实体对于IDs id(265)未找到”)。
我希望能够忽略这个错误,而是显示类似“相关对象丢失”的东西。
似乎可以通过在Twig中进行一些检查来解决这个问题,但是检查关系是否为null或未定义不起作用——它们仍然会找到关系,但当调用相关实体的属性时,异常被抛出。
有人已经解决了这个问题吗?

如果您检查关系的属性是否已定义,而不是关系本身呢? - Jeroen
相同的异常被抛出。 - Geoff Maddock
2个回答

4
您可以在Twig扩展中检查实体是否存在。
类似这样的代码:
public function isRelatedEntityDefined($entity)
{    
   try {
        if(isset($entity->getSomeField()) return true;        
   } catch (EntityNotFoundException $e) {
        return false;
   }
}

好主意。我尝试了一下,它确实有效。然而,我想实现更通用的东西,可以在每种情况下捕获它,而不必在可能显示关系的每个地方调用一个twig过滤器。 - Geoff Maddock
你到底想要显示什么?如果你使用实体的toString方法,你可以在那里实现try catch吗? - Jeroen
如果我这样做,就会出现错误,指出toString现在必须抛出异常,例如:错误:方法Proxies__CG__\App\Entity\Location::__toString()不能抛出异常,捕获Doctrine\ORM\EntityNotFoundException:找不到ID为id(265)的类型为'App\Entity\Location'的实体 - Geoff Maddock
这是使用类似于Twig扩展中的try catch吗? - Jeroen
如果我将try-catch移动到toString中,那就可以满足我的需求了,如果它能正常工作的话。 - Geoff Maddock
那么,通过确保实体在结果中被获取或根本不在结果中,尝试解决它是否可能呢?否则,我认为你最好使用Twig过滤器/函数或在服务中预先检查结果。 - Jeroen

0

看一下这个主题使用Doctrine2进行级联删除

问题不是来自您的注释吗?

在您拥有的一侧,ID仍然被定义,但实体不再存在。

您应该像这样做:

* @JoinColumn(name="locationId", referencedColumnName="id", onDelete="set null")

这绝对是一个明智的评论。然而,我想忽略完整性约束,因为在这种情况下,我需要能够处理部分恢复的数据库,并且本质上会有一些这些悬空关系。 - Geoff Maddock
明白了。我理解你的观点。 那我就不知道了,我猜想你不应该遇到这种情况,因为Doctrine应该会抛出某种异常。 - Gregoire Ducharme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接