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
});
Run Code Online (Sandbox Code Playgroud)
而不是在我的类中处理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...
});
Run Code Online (Sandbox Code Playgroud)
我想避免这种情况,因为如果异常处理是client_db类的内部,我会知道该错误也特定于该操作,我不必编写错误解析器.
好吧,所以silex唯一能做的就是在$app->run()通话过程中捕获异常.没有任何东西阻止你自己早先捕获异常.
我怀疑您的问题是由以下原因引起的.假设您的代码实际上是:
try{
$this->_connection->insert('clients', $clientInfo);
}catch(PDOException $e){
// HANDLE EXCEPTION HERE
}
Run Code Online (Sandbox Code Playgroud)
好吧,问题是你在一个命名空间的类中.这意味着所有类名都与当前名称空间相关.要引用use它们所需的全局命名空间,或者为它们添加前缀\.
你需要做的是:
try{
$this->_connection->insert('clients', $clientInfo);
}catch(\PDOException $e){
// HANDLE EXCEPTION HERE
}
Run Code Online (Sandbox Code Playgroud)
这会解决您的问题吗?
| 归档时间: |
|
| 查看次数: |
2178 次 |
| 最近记录: |