Twig:找不到实体

Joh*_*ann 0 symfony twig sonata-admin

我创建了一个带有existant数据的新应用程序.

我使用sonatadminbundle列出对象"Formule"的数据网格.在我的对象"Formule"中,我与对象"Contact"有关系.在我的列表中需要显示这种关系.但我知道过去有一些联系人被删除了.我想在我的行datagrid的模板中做这个:

{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
{% block field%}
    {% if object.getContact.name is defined  %}
        {{ object.getContact.name }} //EntityWasNotFound
    {% else %}
        This contact was deleted in the past
    {% endif %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

因此,此错误会在行中返回EntityWasNotFound异常或删除联系人.我不知道是否有联系人.我用"不是空","定义","空"......没什么好的:(

谢谢

Mar*_*nte 8

当您使用softdeleteable或者您的遗留数据库存在一些完整性问题(没有相关行的ID)时,这是一个常见问题.在这种情况下,实体的代理被创建得很好(带有它的id),但是当你得到别的东西时,代理会尝试获取真实实体并且无法抛出这个异常

你可以以多种方式进行,但在奏鸣曲管理员有点困难所以我的建议是创建一个方法来处理异常,然后有更多的信息

use Doctrine\ORM\EntityNotFoundException;

....

public function hasContact()
{
    try {
        $ret = parent::getParent();
        if (isset($ret) && $ret->getName()) {
            return true;
        }
        return false;
    } catch (EntityNotFoundException $e) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然你可以将它移出实体并为它创建一个枝条扩展(未测试)

public function isEntityDefined($entity = null)
{
    if($entity instanceof \Doctrine\ORM\Proxy\Proxy){
        try {
            $entity->__load();        
        } catch (EntityNotFoundException $e) {
            $entity = null;
        }
    }
    return isset($entity);
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用控制器中的以下代码禁用softdeleteable

 $this->get('doctrine.orm.entity_manager')->getFilters()->disable('softdeleteable');
Run Code Online (Sandbox Code Playgroud)

当然这样yuo需要查看deletedAt属性来检查实体是否被删除