Ну, во-первых, вам придется обернуть только одну строку в index.php
.И на самом деле, это может быть хорошо, если у вас есть исключения, которые вы не хотите показывать (например, в производственной среде).
Второй момент заключается в том, что код, связанный с вашей базой данных, должен быть сконцентрирован в моделях.Таким образом, вы можете ввести вспомогательный класс, который выглядит примерно так:
class SafeQueryHelper{
public static function safeQueryRun(Doctrine_Query $q, array $parameters, $hydration=Doctrine_Core::HYDRATE_RECORD){
try{
return $q->execute($parameters, $hydration);
}
catch(Exception $e){
//Handle yur exceptions here
}
}
}
Чем вы просто замените $query->execute($params,$hydration)
во всех ваших моделях на SafeQueryHelper::safeQueryRun($query,$params,$hydration)
.Не забудьте загрузить его с $this->load->helper('SafeQueryHelper')
или через конфиг .
Для таких методов записи, как update
и delete
- вам придется обернуть его в try .. catch
.
Ну, и если ваша логика, связанная с базой данных, не сконцентрирована в моделях ... На самом деле это ничего не меняет, но это означает, что у вас плохо разработанное приложение, которое нарушает основной принцип MVC
pattern, так что начните рефакторинг.
Последнее возможное решение - взломать базовые классы Doctrine (в частности, Doctrine_Connection
) и обернуть в try ... catch
строки, которые соответствуют фактическим запросам.Но это плохая идея, я бы на самом деле этого не сделал.
Небольшое обновление: поскольку все объекты сущностей Doctrine являются подразделами Doctine_Record
, вы можете расширить SafeQueryHelper
с помощью методов для упаковки save
, delete
etc:
public static function SafeSave(Doctrine_Record $entity){
try{
$entity->save();
}
catch(Exception $e){
//catch it
}
}
Чем заменить $entity->save()
на SafeQueryHelper::SafeSave($entity)