2011-12-31 4 views
0

シレックスはアプリ内のどこにでもスローされた例外をハイジャックしているようです。私の問題は、私は例外をスローされたら、基本的に無視されるデータベースからユーザーデータを渡す/取得するために使用するuser_db_interfaceクラスがあることです。シレックス例外オーバーライドをお探しですか?

たとえば、PDOExceptionを生成する重複したユーザーの電子メールエントリがある場合、そのクラス内でその例外を処理する代わりに、クラス外でエラー処理クロージャを追加する必要があります。私はむしろ内部的に例外を処理したいので、この例外を処理してスクリプトを続けることができます。

例外オーバーライドやバイパスのようなものはありますか?

###### PROVIDER REG ####### 
// I'M LOADING DOCTRINE "NATURALLY" AND NOT REGISTERING IT WITH $APP IN HOPES OF 
// AVOIDING THE EXCEPTION HIJACKING. 
################################################################### LOAD DOCTRINE NATURAL 

require 'vendor/Doctrine/Common/ClassLoader.php'; 

$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', __DIR__ . '/../vendor'); 
$classLoader->register(); 

$connectionOptions = array(
    'driver' => 'pdo_mysql', 
    'dbname' => 'MY_DB', 
    'host'  => 'localhost', 
    'password' => 'MY_PASS', 
    'user'  => 'MY_USER', 
); 

$driver = new \Doctrine\DBAL\Driver\PDOMySql\Driver; 
$connection = new \Doctrine\DBAL\Connection($connectionOptions, $driver); 

###################################################################### LOAD MY EXTENSION 
$app['autoloader']->registerNamespaces(array('TableTrackPro' => __DIR__,)); 

$app->register(new TableTrackPro\ClientDBInterfaceExtension(),array('app'=>$app)); 
$app['client_db_interface']->set_connection($connection); 


################################################## 
################################################## 

################################################# MY DB INTERFACE CLASS (stripped for clarity) 

namespace TableTrackPro; 

class ClientDBInterface{ 

    private $_connection; 

    public function set_connection($connection){ 
     $this->_connection = $connection; 
    } 

    public function insert_client($clientInfo){ 
     // SET RETURN OBJECT 
     $returnObject['status'] = 'ok';  // default return status 
     $returnObject['message'] = false; 


// SANITIZE CLIENT INFO ETC... 

// THIS IS WHERE I WOULD LIKE TO HANDLE MY OWN EXCEPTIONS 
    try{ 
     $this->_connection->insert('clients', $clientInfo); 
    }catch(PDOException $e){ 
     // HANDLE EXCEPTION HERE 
    } 
    return json_encode($returnObject); 
} 


#### END CLASS ##### 


### CONTROLLERS #### 

$app->post('/postNewClient', function() use($app){ 
    $clientInfo = $_POST; 
    $returnObject = $app['client_db_interface']->insert_client($clientInfo); 
    return json_encode($returnObject); // <-- I handle this object with javascript via an AJAX call 
}); 

の代わりに、私は、私のようなコントローラエリアにエラーハンドラを追加する必要が望むように私は、データを返すことができるように、私のクラスではPDOExceptionを扱う:

ここ

は一例です
$app->error(function (\Exception $e, $code) { 
    // error handling code, I'd now have to handle any client-db specific errors outside of my client_db class... 
}); 

私はこれを避けたいのですが、例外処理がclient_dbクラスの内部であった場合、エラーはそのアクションにも固有であり、エラーパーサを記述する必要はないことがわかります。

+0

エラーをどこにキャッチしようとしているのかわかりにくいです。あなたは 'app.php'と' MyClass.php'を使って最小限の例を示し、どこでエラーをキャッチしたいのかを説明できますか? – igorw

+0

@igorw、上記の質問に少しの例を追加しました。それが役に立ったら教えてください。 –

答えて

5

だから、の呼び出し中にsilexだけが例外をキャッチします。そこにはあなた自身が以前に例外をキャッチすることを妨げるものは何もありません。

私はあなたの問題が次の原因で発生していると思われます。あなたのコードが実際には次のようになっているとします。

try{ 
    $this->_connection->insert('clients', $clientInfo); 
}catch(PDOException $e){ 
    // HANDLE EXCEPTION HERE 
} 

まあ、問題はあなたが名前空間のクラスにいることです。これは、すべてのクラス名が現在の名前空間に関連していることを意味します。グローバル名前空間を参照するには、use、または\という接頭辞が必要です。あなたがする必要がどのような

は次のとおりです。

try{ 
    $this->_connection->insert('clients', $clientInfo); 
}catch(\PDOException $e){ 
    // HANDLE EXCEPTION HERE 
} 

が、これはあなたの問題を解決していますか?

+0

興味深い。私のindex.phpファイルにはrequireと$ app-> run()があります。私は$ app-> run()コールを持っていないスクリプトでリクエストをインターセプトしなければならないと思います。私はそれを試してみましょうと私はあなたに知らせるでしょう。 –

+0

私が言ったように、例外は本当に遅く捕らえられます。スタック内でtry-catchブロックが上位にある場合は、うまく動作するはずです。 '$ app-> run()'の動​​作を変更する必要はありません。 – igorw

+0

Igor、あなたは100%正しいですが、それは$ app->実行呼び出しでさえありませんでした。私が名前空間のクラスにあって、 "\"を使用していなかったという事実でした。 –

関連する問題