2011-07-18 7 views
0

codeigniterフレームワークでdoctrine 1.2 ORMの例外をすべてキャッチするにはどうすればよいかと思いますが、index.php全体をtry catchでラップするのは嫌ですがクエリの前後にtry catchを実行します。CodeigniterのDoctrine例外をキャッチする最善の方法

+0

ていない場合は、それらの2と$entity->save()を置き換えるより

public static function SafeSave(Doctrine_Record $entity){ try{ $entity->save(); } catch(Exception $e){ //catch it } } 

、どの他のオプションがあなたの頭に浮かんでいますか?あなたはすでにこれらのいずれかを試しましたか? 'index.php'では何が悪いですか? – hakre

答えて

1

まず、index.phpで1行だけを囲む必要があります。実際には、(プロダクション環境などで)表示したくない例外がある場合には、これが有効です。

2番目の点は、データベース関連のコードをモデルに集中させることです。だから、あなたはあなただけSafeQueryHelper::safeQueryRun($query,$params,$hydration)にすべてのモデルで$query->execute($params,$hydration)を置き換えますたより

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 
     } 
    } 
} 

のようなものであるヘルパークラスを導入することがあります。 $this->load->helper('SafeQueryHelper')またはthe configをロードすることを忘れないでください。

updatedeleteのようなレコードメソッドの場合は、try .. catchにラップする必要があります。

データベースに関連するロジックがモデルに集中していない場合...実際には何も変わりませんが、その意味では、MVCパターンの本質的な原則に違反する設計が不適切なアプリケーションがあることを意味します。リファクタリングを開始します。

最後に考えられる解決策は、Doctrineのコアクラス(具体的にはDoctrine_Connection)をハックして、実際の処理に対応する行をtry ... catchにすることです。しかし、それは悪い考えです、私は本当にそれをしません。

少し更新:すべてのDoctrineのエンティティオブジェクトとしてDoctine_Recordのsubclaesesがyoumay saveを包むための方法でSafeQueryHelperを拡張され、deleteなど:SafeQueryHelper::SafeSave($entity)

関連する問題