Symfony: обработка исключения EntityNotFoundException в отношении Doctrine

Когда я попытался отобразить связанный объект в 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, но проверка того, является ли отношение нулевым или не определено, не работает - они оба все еще находят отношение, но когда свойство вызывается для связанной сущности, возникает исключение.

Кто-нибудь уже решил эту проблему?

А что, если вы проверите, определено ли свойство отношения, а не само отношение?

Jeroen 21.03.2018 21:54

Выдается такое же исключение.

Geoff Maddock 21.03.2018 21:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
3
2
3 148
2

Ответы 2

Вы можете проверить, существует ли объект в расширении Twig

Что-то вроде:

public function isRelatedEntityDefined($entity)
{    
   try {
        if (isset($entity->getSomeField()) return true;        
   } catch (EntityNotFoundException $e) {
        return false;
   }
}

Отличная идея. Я попробовал это, и это работает. Однако я хотел бы реализовать что-то более общее, которое бы улавливало это в каждом случае, вместо того, чтобы вызывать фильтр веток везде, где я мог бы отображать отношение.

Geoff Maddock 22.03.2018 00:43

Что именно вы пытаетесь отобразить? Если вы используете метод toString объекта, вы могли бы реализовать здесь try catch?

Jeroen 22.03.2018 09:26

Если я это сделаю, я получаю сообщение об ошибке, указывающее, что toString теперь должен вызывать исключение, например: Ошибка: метод Proxies__CG __ \ App \ Entity \ Location :: __ toString () не должен вызывать исключение, пойманный Doctrine \ ORM \ EntityNotFoundException: Entity of тип 'App \ Entity \ Location' для идентификаторов id (265) не найден

Geoff Maddock 22.03.2018 14:21

Это с попыткой, как в расширении Twig?

Jeroen 22.03.2018 15:47

Это если я перенесу try-catch в toString. Этого было бы для меня достаточно, если бы это сработало.

Geoff Maddock 23.03.2018 21:43

Ну, можно ли попытаться решить эту проблему, убедившись, что объект извлекается или вообще не отображается в результате? Еще я думаю, что лучше всего использовать фильтр / функцию Twig или предварительно проверить результаты в службе.

Jeroen 25.03.2018 14:42

Взгляните на эту тему При удалении каскада с doctrine2

Разве проблема не в твоей аннотации?

На вашей стороне идентификатор все еще определен, но объект больше не существует.

Вы должны сделать что-то вроде этого:

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

Это определенно разумный комментарий. Однако я хотел бы иметь возможность игнорировать здесь ограничение целостности, потому что в этом случае мне нужно иметь возможность учитывать работу с базой данных, которая была частично восстановлена ​​и по своей сути будет иметь некоторые из этих опасных отношений.

Geoff Maddock 22.03.2018 14:19

Понятно. Я понимаю вашу точку зрения. Тогда я не знаю, я предполагаю, что у вас не должно быть такой ситуации, поскольку Doctrine должна генерировать какое-то исключение.

Gregoire Ducharme 22.03.2018 14:24

Другие вопросы по теме