Как обрабатывать ограничения внешнего ключа из приложения Symfony? - PullRequest
1 голос
/ 20 декабря 2010

Может быть, я просто ничего не знал о решении своей проблемы и, черт возьми, может быть, оно встроено ... Я просто не смог найти такое решение. Я пассивно искал последние две недели и активно в течение последнего дня.

Как мне изящно обработать ограничение внешнего ключа в Symfony?

Я рассмотрел возможность перехвата исключения (Doctrine_Connection_Exception) и при условии, что это ограничение внешнего ключа, а затем переадресация пользователя в модуль ошибок с действием для ограничений внешнего ключа. Однако избыточность кода является ужасной, и даже если я добавлю ее в свой базовый класс действий, необходимость помещать блок try-catch вокруг каждого вызова базы данных станет уродливой. Не говоря уже о , предположение, что это исключение для ограничения внешнего ключа, является ужасной идеей, поскольку это исключение вызывается при наличии синтаксиса SQL и фактических ошибок соединения.

Я думал об использовании методов getPortableCode () и getPortableMessage () - которые унаследованы от класса исключения - чтобы определить, является ли это ограничением внешнего ключа (что они могут сделать), но они не дают абсолютно никакой информации о само ограничение. Например, когда генерируется исключение ограничения, getPortableCode () возвращает «-5», а getPortableMessage () возвращает «уже существует». Конечно, я мог бы выяснить, что не получилось, и вызвать ошибку для моего пользователя, если бы было одно ограничение, но, конечно, я усложнил ситуацию с несколькими ограничениями.

Во всяком случае, хватит моего бродяжничества, я пытаюсь выяснить, что другие разработчики делают в моей ситуации ... Кажется, это должно быть чем-то, что описано в неаккуратном "нежном введении".

1 Ответ

0 голосов
/ 20 декабря 2010

Ответ на этот вопрос зависит от того, что создает записи базы данных.

Если ответом является отправка формы, вы должны использовать систему проверки Symfony. Doctrine предоставляет валидаторы для проверки, является ли отношение действительным или объект существует. Взгляните на sfValidatorDoctrineChoice и sfValidatorDoctrineUnique.

Если вы создаете записи базы данных, не основанные на пользовательском вводе, решение здесь состоит в том, чтобы выполнить проверку самостоятельно, либо с помощью валидатора, либо с помощью ручного вызова БД. Я полагаю, вы также можете попробовать / поймать.

...