0

Silex は、アプリ内のどこかでスローされた例外をハイジャックしているようです。これに関する私の問題は、例外がスローされると基本的に無視されるデータベースからユーザーデータを渡す/取得するために使用する 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 クラスの内部にある場合、エラーもそのアクションに固有のものであることがわかり、エラー パーサーを記述する必要がないため、これは避けたいと思います。

4

1 に答える 1

5

了解しました。silexが行うのは、$app->run()呼び出し中に例外をキャッチすることだけです。そこには、自分で例外を早期にキャッチすることを妨げるものは何もありません。

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

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
}

これで問題は解決しますか?

于 2012-01-01T19:28:17.997 に答える