LoginSignup
17

More than 5 years have passed since last update.

SilexとDBALを組み合わせたときに実行SQLをロギングする

Last updated at Posted at 2013-11-19

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を使う方がいろいろ仕組みが整っているので便利ですよ。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17