Contents
Laravel デバッグ
Laravel でデバッグするときの方法をいくつか見ていきます。
ヘルパメソッド
dd
dd は dump and die の略です
指定された変数の内容を表示し、スクリプトの実行を停止します。
1 2 |
dd($value); dd($value1, $value2, $value3, ...); |
dump
dump は指定した変数をダンプします。
1 2 |
dump($value); dump($value1, $value2, $value3, ...); |
SQLデバッグ
dd / dump
dd
メソッドとdump
メソッドが使用できます。
1 2 3 |
DB::table('users')->where('votes', '>', 100)->dd(); DB::table('users')->where('votes', '>', 100)->dump(); |
enableQueryLog/getQueryLog
SQLとバインドされた値を確認
1 2 3 4 5 6 7 |
DB::enableQueryLog(); $users = User::whereIn('id', [1, 2])->orderBy('id', 'desc')->get(); dd(DB::getQueryLog()); DB::enableQueryLog(); $users = DB::table('users')->whereIn('id', [1, 2])->orderBy('id', 'desc')->get(); dd(DB::getQueryLog()); |
結果
1 2 3 4 5 6 7 8 9 10 |
array:1 [▼ 0 => array:3 [▼ "query" => "select * from `surveys` where `id` in (?, ?) order by `id` desc" "bindings" => array:2 [▼ 0 => 1 1 => 2 ] "time" => 0.57 ] ] |
toSql/getBindings
SQLとバインドされた値を確認
1 2 |
$sql = DB::table('users')->whereIn('id', [1, 2])->orderBy('id', 'desc'); dd($sql->toSql(), $sql->getBindings()); |
結果
1 |
"select * from `users` where `id` in (?, ?) order by `id` desc" |
1 2 3 4 |
array:2 [▼ 0 => 1 1 => 2 ] |
Laravelデバッグバー
Laravelデバッグバーは Laravel のデバッグ用パッケージです。
PHP Debug Bar を Laravel 仕様にしたものとなります。
インストール
barryvdh/laravel-debugbar パッケージを composer でインストールします。
デバッグ用なので --dev をつけるようにします。
- Laravel 6.x/7.x
1$ composer require --dev barryvdh/laravel-debugbar - Laravel 5.x
1$ composer require --dev barryvdh/laravel-debugbar:~2.4
設定
- Laravel 5.5 以降の場合、Package Auto Discovery でデバッグ用の設定ファイル
config\debugbar.php
が生成されます。
1 |
$ php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider" |
-
Laravel 5.4 以前の場合、
config/app.php
にサービスプロバイダーとファサードとして追記します。123456789101112'providers' => [.../** Package Service Providers...*/Barryvdh\Debugbar\ServiceProvider::class,],'aliases' => [...'Debugbar' => Barryvdh\Debugbar\Facade::class,], -
部分的な計測
123Debugbar::startMeasure('render','Time for rendering');~処理~Debugbar::stopMeasure('render');確認
ウェブページを表示すると下部にデバッグバーが表示されます。
ログファイル出力
Log ファサード
-
Log::emergency($message);
-
Log::alert($message);
-
Log::critical($message);
-
Log::error($message);
-
Log::warning($message);
-
Log::notice($message);
-
Log::info($message);
-
Log::debug($message);
-
任意の値
1Log::debug(任意の値);storage\logs\laravel.log
に出力されます。
query ログ
AppServiceProvider.php
の register にログ出力の処理を追加します。
- そのまま Query Time と Query を出力
123456public function register(){\DB::listen(function ($query) {\Log::debug("[Query Time:{$query->time}s] $query->sql");});} -
バインド変数を置き換えて Query を出力
12345678910public function register(){\DB::listen(function ($query) {for ($i = 0; $i < count($query->bindings); $i++) {$sql = preg_replace("/\?/", $query->bindings[$i], $query->sql, 1);}\Log::debug("[Query Time:{$query->time}s] $sql");});} -
laravel-debugbar に合わせた Query 出力
laravel-debugbar にある QueryCollector を使います。
QueryCollector は、バインディング+タイミングを含むすべてのクエリを表示するコレクターです。12345678910111213141516171819202122232425262728293031323334public function register(){// .envで判別if (env('APP_ENV') !== 'local' || env('APP_DEBUG') !== true) {return;}$queryCollector = new QueryCollector();$queryCollector->setDataFormatter(new QueryFormatter());$queryCollector->setRenderSqlWithParams(true);\DB::listen(function ($query) use($queryCollector) {$queryCollector->addQuery($query->sql,$query->bindings,$query->time,$query->connection);$sqlExecCollect = $queryCollector->collect();$statements = $sqlExecCollect['statements'];foreach ($statements as $statement) {$query = $statement['sql'];$time = $statement['duration_str'];$logMessage = '[Query Time: ' . $time . '] ' . $query;}\Log::channel('query')->debug($logMessage);$queryCollector->reset();});}ファイルを指定して出力する
config/logging.php
にクエリログ用に出力ログチャネルを追記します。12345678910111213'channels' => ['stack' => ['driver' => 'stack','channels' => ['single', 'query'],'ignore_exceptions' => false,],...'query' => ['driver' => 'daily','path' => storage_path('logs/query.log'),'level' => 'debug',],],
まとめ
Laravel Debugbar は画面表示と同時にデバッグ内容を確認できるので、開発時にはおすすめです。
クエリログなどはログファイルに出力するようにしておくと、チェックし易くなるかと思います。