PHPの開発でフレームワークとしてSilexを使っている場合、
複雑なORMを使わずにSilexとセットで使いやすいDBALを使うことが多いかもしれない。
その場合、次のようにDoctrineServiceProviderを使ってデータベース接続設定をし、
$app['db.config']でSQLLoggerを設定すると実行されたSQLのデータが蓄積されるようになる。
$app->register(new Silex\Provider\DoctrineServiceProvider(), [
'db.options' => [
'driver' => 'pdo_mysql',
'dbname' => 'db name',
'host' => 'your host',
'user' => 'user name',
'password' => 'password',
'charset' => 'utf8mb4',
],
]);
$sqlLogger = new Doctrine\DBAL\Logging\DebugStack();
$app['db.config']->setSQLLogger($sqlLogger);
処理の実行後のタイミングでSQLLoggerに蓄積された実行SQLのデータを、
MonologServiceProviderなどを利用してMonologを使っている場合はMonologで、
それ以外の場合は適当に次のようにログ出力すればよい。
$app->after(function() use ($app, $sqlLogger) {
foreach ($sqlLogger->queries as $query) {
$app['monolog']->debug($query['sql'], [
'params' => $query['params'],
'types' => $query['types'],
'execution_ms' => $query['executionMS'],
]);
}
});
それ以外にもエラー(例外)が起こったときも、
次のようにすれば最後に実行されたSQLのロギングが可能。
$app->error(function(\Exception $e, $code) use ($app, $sqlLogger) {
if ($e instanceof PDOException && count($sqlLogger->queries) > 0) {
$executedQueries = $sqlLogger->queries;
$lastExecutedQuery = array_pop($executedQueries);
$app['monolog']->err($lastExecutedQuery['sql'], [
'params' => $lastExecutedQuery['params'],
'types' => $lastExecutedQuery['types'],
]);
}
});
直接PDOを使うよりDBALを使う方がいろいろ仕組みが整っているので便利ですよ。