Лучший способ поймать исключения доктрины в Codeigniter - PullRequest
0 голосов
/ 18 июля 2011

Что, по вашему мнению, является наилучшим способом перехвата всех исключений ORM из доктрины 1.2 в среде codeigniter, я не хотел бы заключать весь index.php в попытку catch, но также не делать попытку catch до и после каждого запроса ,

1 Ответ

1 голос
/ 26 августа 2011

Ну, во-первых, вам придется обернуть только одну строку в 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)

...