Когда я попытался отобразить связанный объект в Twig, и это отношение отсутствует, потому что идентификатор находится в родительском объекте, но связанный объект не был в текущей базе данных, Symfony выдает ошибку 500
// EntityNotFoundException Twig_Error_Runtime An exception has been thrown during the rendering of a template ("Entity of type 'App\Entity\Location' for IDs id(265) was not found").
Я хотел бы иметь возможность игнорировать эту ошибку и вместо этого отображать что-то вроде «Связанный объект отсутствует».
Казалось, что это можно решить с помощью некоторой проверки в Twig, но проверка того, является ли отношение нулевым или не определено, не работает - они оба все еще находят отношение, но когда свойство вызывается для связанной сущности, возникает исключение.
Кто-нибудь уже решил эту проблему?
Выдается такое же исключение.




Вы можете проверить, существует ли объект в расширении Twig
Что-то вроде:
public function isRelatedEntityDefined($entity)
{
try {
if (isset($entity->getSomeField()) return true;
} catch (EntityNotFoundException $e) {
return false;
}
}
Отличная идея. Я попробовал это, и это работает. Однако я хотел бы реализовать что-то более общее, которое бы улавливало это в каждом случае, вместо того, чтобы вызывать фильтр веток везде, где я мог бы отображать отношение.
Что именно вы пытаетесь отобразить? Если вы используете метод toString объекта, вы могли бы реализовать здесь try catch?
Если я это сделаю, я получаю сообщение об ошибке, указывающее, что toString теперь должен вызывать исключение, например: Ошибка: метод Proxies__CG __ \ App \ Entity \ Location :: __ toString () не должен вызывать исключение, пойманный Doctrine \ ORM \ EntityNotFoundException: Entity of тип 'App \ Entity \ Location' для идентификаторов id (265) не найден
Это с попыткой, как в расширении Twig?
Это если я перенесу try-catch в toString. Этого было бы для меня достаточно, если бы это сработало.
Ну, можно ли попытаться решить эту проблему, убедившись, что объект извлекается или вообще не отображается в результате? Еще я думаю, что лучше всего использовать фильтр / функцию Twig или предварительно проверить результаты в службе.
Взгляните на эту тему При удалении каскада с doctrine2
Разве проблема не в твоей аннотации?
На вашей стороне идентификатор все еще определен, но объект больше не существует.
Вы должны сделать что-то вроде этого:
* @JoinColumn(name = "locationId", referencedColumnName = "id", onDelete = "set null")
Это определенно разумный комментарий. Однако я хотел бы иметь возможность игнорировать здесь ограничение целостности, потому что в этом случае мне нужно иметь возможность учитывать работу с базой данных, которая была частично восстановлена и по своей сути будет иметь некоторые из этих опасных отношений.
Понятно. Я понимаю вашу точку зрения. Тогда я не знаю, я предполагаю, что у вас не должно быть такой ситуации, поскольку Doctrine должна генерировать какое-то исключение.
А что, если вы проверите, определено ли свойство отношения, а не само отношение?