実践知識

Laravelでのデバッグ作業(実践編)

2019/02/05

- デバッグを制す者は、プログラミングを制す -

プログラマにとって必須のスキルがデバッグ作業です。

これを知らないとずっとバグと闘い続けるはめになり開発効率が上がりません。

Laravel の書式を覚えることも重要ですが、同じくらいデバッグのやり方を覚えることも重要です。

デバッグ作業ではログ出力をすることからはじまります。

以前、Laravel での基本的なログ出力に関してエントリーをしました。

今回はさらにもう一歩踏み込んだ実践的な内容をエントリーします。

 
INDEX

 

配列やオブジェクトのケース

laravelではログ出力のやり方が主に2つあります。

・ヘルパー関数 logger()
・Logファサード

僕の場合、Logファサードを使ったロギング(ログを記録すること)をよく使います。

しかし、配列やオブジェクトは出力できません。

その場合は、print_rを使います

 
書式


// ログに配列を展開して吐き出す
Log::debug(print_r($arr, true));

// オブジェクトも可能
Log::debug(print_r($object, true));

 
書式例


// コントローラ
:
$message = ['a' => 1, 'b' => 2, 'c' => 3];
Log::debug('$message="'.print_r($message,true).'"');
:

 
ログファイル(実行結果)

 

クエリービルダーのケース

Eloquent の場合だと、getメソッドで取得してくる部分をtoSqlメソッドに切り替えることで実際に実行されるSQL文を取得することができます。


$results = User::where('id',1)->toSql();
Log::debug('$results="' .$results. '"');

 
ログファイル(実行結果)

 

プリペアドステートメント(未完成なSQL)

プリペアドステートメントもそのままだと出力できません。


DB::enableQueryLog();  // 確認したいSQLの前にこれを仕込む

$results=DB::select('select * from users where id=?',['1']);

Log::debug(DB::getQueryLog());  // SQL実行後にこのメソッド

プリペアドステートメント

SQL文を最初に用意しておいて、その後はクエリ内のパラメータだけを変更してクエリを実行できる機能のことです。

 
ログファイル(実行結果)

 

Tinker

Tinker を使ってDB の処理の内容を確認する方法もあります。

これを使うとコマンドラインからデータベースに直接働きかけることができます。

正確なシンタックスを覚えていないメソッドをテストしたいときはよく利用します。

まず、artisanコマンドで tinker を起動します。
(※tinker は Laravel に標準で入っています)


php artisan tinker

このあとは、コントローラに書くようなモデルなどの操作を書き、Enter を押すとその場で実行されます。

以下は Eloquentリレーションを Tinker で確認したケースです。

 

Laravelデバッグバー

致命的なバグはデバッグバー自体が表示されなかったりしますが、使い勝手からいうと圧倒的に便利です。

オブジェクトのロギングやSQLの確認、パフォーマンス測定などできます。

ブラウザ上で確認できるところもおススメのポイントです。

具体的な使い方はこちらをご覧ください。

 
Laravelの開発においてのデバッグのやり方については以上です。

本庄マサノリ

仕事でLaravelを使っています。気づいたことや新しい発見など情報を発信していきます。メールはこちら

 

-実践知識