Symfony services.yaml 处理异常
Symfony services.yaml handle exception
在我的 services.yaml
中,我有以下代码:
services:
# prepare database
DatabaseProvider:
class: Kepler\Providers\DatabaseProvider
arguments: ['%database.reader.dsn%', '%database.reader.username%', '%database.reader.password%']
ReaderPDO:
class: PDO
factory: ['@DatabaseProvider', generateDatabaseConnection]
WriterPDO:
class: PDO
factory: ['@DatabaseProvider', generateDatabaseConnection]
和DatabaseProvider:generateDatabaseConnection
public function generateDatabaseConnection() {
try {
return new PDO($this->host, $this->username, $this->password);
} catch (Exception $e) {
return new PDO($this->host, $this->username, $this->password);
$_GLOBALS['db_error'] = true;
}
}
所以我的问题来了:会出现PDO连接不上的情况working/failing。那么我如何捕获此异常和 return 一般 404 页面(这是我不需要任何数据库连接的页面)?
一些基本分析:
- 我认为这在 symfony 启动期间失败了
- 即使我 return null,或者 return 什么都没有,代码将继续 autowiring,然后在控制器中失败需要数据库连接
在 catch
块中有一个 return
应该被认为是有害的,如果它 完全一样 被 return 编辑try
块。
设置一个全局值确实是老派,而不是 symfony 的方式。相反,您会抛出一个特定的异常(或者只是不捕获 PDO 异常),并为由此产生的 kernel exception 添加一个事件侦听器,您可以在其中查找该特定异常和 return您想要的正确错误页面。
如果你只想要 404 页面,你可以抛出 NotFoundHttpException
or maybe more appropriate the ServiceUnavailableException
...
在我的 services.yaml
中,我有以下代码:
services:
# prepare database
DatabaseProvider:
class: Kepler\Providers\DatabaseProvider
arguments: ['%database.reader.dsn%', '%database.reader.username%', '%database.reader.password%']
ReaderPDO:
class: PDO
factory: ['@DatabaseProvider', generateDatabaseConnection]
WriterPDO:
class: PDO
factory: ['@DatabaseProvider', generateDatabaseConnection]
和DatabaseProvider:generateDatabaseConnection
public function generateDatabaseConnection() {
try {
return new PDO($this->host, $this->username, $this->password);
} catch (Exception $e) {
return new PDO($this->host, $this->username, $this->password);
$_GLOBALS['db_error'] = true;
}
}
所以我的问题来了:会出现PDO连接不上的情况working/failing。那么我如何捕获此异常和 return 一般 404 页面(这是我不需要任何数据库连接的页面)?
一些基本分析:
- 我认为这在 symfony 启动期间失败了
- 即使我 return null,或者 return 什么都没有,代码将继续 autowiring,然后在控制器中失败需要数据库连接
在 catch
块中有一个 return
应该被认为是有害的,如果它 完全一样 被 return 编辑try
块。
设置一个全局值确实是老派,而不是 symfony 的方式。相反,您会抛出一个特定的异常(或者只是不捕获 PDO 异常),并为由此产生的 kernel exception 添加一个事件侦听器,您可以在其中查找该特定异常和 return您想要的正确错误页面。
如果你只想要 404 页面,你可以抛出 NotFoundHttpException
or maybe more appropriate the ServiceUnavailableException
...