LoginSignup
288
318

More than 1 year has passed since last update.

【超入門】Laravelのデバッグ手法22選

Last updated at Posted at 2021-12-06

はじめに

Laravel Advent Calendar 2021 7日目の投稿です。
枠があまっていたので1日目に続いて7日目も投稿します。

他の記事のタイトルを見ると応用的な内容が多かったのでLaravel初心者の方向けにおすすめのLaravelデバッグ方法(tips)を22個ご紹介します。

思ったより数が多くなったので、1つ1つは掘り下げず概要と簡単な使い方をご紹介します。
公式ドキュメントや参考リンクも載せているので詳細はそちらを見てください。

どれか一つでもLaravel開発のヒントになれれば幸いです。

おすすめの手法

特におすすめの方法をご紹介します。

2.17. テストコードを書く

一番のおすすめはテストコードを書くことです。
予期する値と実際の値をテストしながらコードを書くことで一つ一つの処理を確認しながら進めることができます。

2.5. beyondcode/laravel-dump-server

dump() と合わせて使うのですがとても便利です。
レスポンスを汚さないので、ストレスフリーに開発できます。

2.7. tinker

Laravelのコードを実行できるのでここで実行結果を確認をしつつ、整形してテストコードに残すと良いです。

2.11. Log

Laravel標準でログ機能が実装されています。
システムを運用していく上で欠かせないログですが、Laravelでは柔軟に設定できます。

1. PHP標準関数の紹介

1.1. var_dump

var_dump 関数はPHPの標準関数です。
指定した変数をダンプします。

var_dump($value);

var_dump($value1, $value2, $value3, ...);

変数に関する情報をダンプします。
https://www.php.net/manual/ja/function.var-dump.php

var_dump($value);
die; // exit;

処理を止めたい時は die または exit します。

他にもPHPの標準関数として var-exportvar_representationprint-r等ありますが、基本はvar_dumpが使えれば良いでしょう。

1.2. debug_print_backtrace

debug_print_backtrace
関数はPHP標準関数です。
debug_print_backtrace() までの実行過程(バックトレース)で呼び出されたファイル名、関数名、クラス名、引数のリストを表示します。

debug_print_backtrace();

debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);

引数まで出力するとさすがに情報量が多くなるので、 DEBUG_BACKTRACE_IGNORE_ARGS オプションを付けると見やすくなります。

debug_backtrace

こちらはバックトレースの情報を配列で返す関数です。

1.3. マジック定数を使うtips

var_dump(__CLASS__ . '::' . __FUNCTION__ . '#' . __LINE__);
=> string(45) "App\Http\Controllers\BookController::index#21"

var_dump('aaa'); のように適当にたくさん仕込むとどこのやつだっけ?
となるので上のようにしておくとどこを通ったか分かりやすくなるのでおすすめです。__CLASS__ の代わりに __FILE__ も便利

1.4. Xdebug

https://pecl.php.net/package/xdebug
https://xdebug.org

Xdebugを導入するとステップデバッグ、トレース、プロファイリング等が行えます。
Xdebugを動作させるにはPHP拡張機能のインストールやブラウザやIDEでXDebugの各種設定が必要です。

2. Laravelデバッグ手法の紹介

2.1. dump

dump 関数はLaravelのヘルパー関数です。
指定した変数をダンプします。

dump($value);

dump($value1, $value2, $value3, ...);

2.2. dd (dump die)

dd 関数はLaravelのヘルパー関数です。
指定された変数の内容を表示し、スクリプトの実行を停止します。

dd($value);

dd($value1, $value2, $value3, ...);

おそらく一番お世話になる関数。

2.3. ddd (dump die debug)

ddd 関数はfacade/ignitionのヘルパー関数です。

dd 関数の結果を含む、スタックトレース、リクエスト及びIgnitionページで提供されるタブの情報を表示します。

Laravel6.x以降で利用可能です。

dd($value);

ddd($value1, $value2, $value3, ...);

dumpした結果の他にDBクエリー情報等も見れて結構便利

2.4. report

report関数は例外ハンドラを使用して例外をレポートします。

report('Something went wrong.');

report($e);

report関数は string もしくは Throwable を引数として受け取ります。
例外のログを出力しつつ、処理を継続します。

画面に例外を表示することなく、例外をログ出力できるのでバックトレースの確認がしやすいです。
ただし、例外が発生しても処理を継続する挙動になるので利用には注意が必要そうです。

2.5. beyondcode/laravel-dump-server

SymfonyのVar-Dump ServerをLaravelに組み込んだライブラリです。

dump 関数を実行する際、HTTP/APIのレスポンスに干渉しないようにdumpの実行結果をダンプサーバーへ出力します。

2.6. php -a (対話シェル)

-a オプションを付けてphpを実行することで対話シェルを使えます。
対話シェルを使うと、PHPのコードを打ち込んで直接実行できるようになります。

$ php -a

php > $a = 60 * 60;
php > echo $a;
3600

2.7. tinker

Laravelに標準搭載されている対話シェルです。
psyshのラッパーライブラリです。

LaravelのちょっとしたLaravelのコードを対話シェルで実行したい時に使えます。

2.8. spatie/laravel-web-tinker

ブラウザ上でtinkerコマンドを実行できるライブラリです。
GoogleAppEngine上など直接SSHできない環境等でこれを入れておくとお手軽にデバッグできます。

これを入れたまま本番を動かすのは良くないので注意しましょう。

2.9. Tinkervel

Laravelのちょっとした動作確認をすることができるツールです。
コードの実行結果をサーバに保存し、シェアできます。
@mikkame さんが開発してます。

2.10. Tinkerwell

有償アプリですが、Tinkerをデスクトップアプリから実行できるツールです。
ローカルのPHPの実行、SSH経由でリモートのPHPを実行できます。

2.11. Log

var_dump などのデバッグコードを残したまま納品はできないので、気になる部分はログを残すようにします。

LaravelではLogファサードやヘルパー関数が用意されておりログ出力が簡単に行えます。

use Illuminate\Support\Facades\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);

// ヘルパー
logger($message); // debugレベル
info($message); // infoレベル
logger()->error($message); // 任意のレベル

// 関連情報を第二引数として渡せる
Log::debug($message, ['id' => $user->id]);

Log: ログ出力先

Laravelのログはデフォルト(single)では storage/logs/laravel.log へ出力されます。

$ less +F storage/logs/laravel.log

less +F で監視モードでログファイルを開けるのでログ用にターミナルを起動しておくと便利です。

Log: 設定ファイル

config/logging.php にログ周りの設定ファイルがあります。
また、 .env環境変数ファイルから LOG_CHANNEL でログチャンネルを切り替えたり、LOG_LEVEL ログ出力レベルを変更できます。

stack チャンネル
複数のチャンネルにログ出力できます。
デフォルトでは single チャンネルのみに出力する。

single チャンネル
単一のログファイルに追記されます。
storage/logs/laravel.log

daily チャンネル
日毎にログファイルをローテートしてくれます。
storage/logs/laravel-YYYY-MM-DD.log

null チャンネル
ログメッセージを破棄します。(ログの無効化ができます)

他にもチャンネルがあるので詳しくは公式ドキュメントをご参考ください。
https://readouble.com/laravel/8.x/ja/logging.html

※Laravel5.5以前とはログの仕組みが大きく変わっているので古いLaravelの場合は注意が必要です。

2.12. Query Log

$query = \App\User::where('id', 1);
dd($query->toSql(), $query->getBindings());
\DB::enableQueryLog();
\App\User::all();
dd(\DB::getQueryLog());

Laravel SQLの実行クエリログを出力する

2.13. laravel-ray

https://myray.app
有償のデバッグデスクトップアプリのRayです。
Windows, Mac, LinuxのOS上で動作します。

見た目が洗練されていて、Laravelで使う場合はPHP拡張機能を追加する必要はなくComposerでライブラリをインストールするだけでokです。

XDebugほど高機能ではないですがブレークポイントを貼ることもできます。
実行速度の計測用ヘルパーが用意されていてデバッグするのに役立ちます。

ミライトデザイン Advent Calendar 2021の18日目に紹介記事を書かせていただきました。

Laravel Ray 進化したDumpデバッグデスクトップアプリ

ray($anything);
ray($anything, $somethingElse);
ray($anything)->green();
ray()->queries();
ray()->measure();
ray()->trace();
ray()->pause();
ray()->ban();

2.14. barryvdh/laravel-debugbar

クエリ実行ログ、ルーティング、ビュー、セッション等の様々な情報をデバッグバーとして出力してくれます。
Blade開発時に効果を発揮します。

2.15. beyondcode/laravel-debugbar-companion

デバッグバーのデスクトップアプリです。
デバッグバーをより便利に使いたい人はご検討ください。
(しばらくBlade触ってないので筆者は使ったことないです...)

2.16. laravel/telescope

Telescope(テレスコープ:望遠鏡)は、ローカル開発環境のデバッグツールです。
デバッグバー同様、様々な情報を出力してくれます。
API開発時に効果を発揮します。

2.17. テストコードを書く

テストコードは自分の書いたコードが、想定通りに動いているか確認するためのものです。
不具合を再現させるテストコードを書いて、実コードを修正すると再発防止になります。

最初からテストコードを書くのは難しいですが、テストコードがあるとより効率的に開発を進めることができます。
手始めにtinkerで動作確認した内容をテストコードにしていくと良いと思います。

3. ブラウザの開発者ツール

3.1. Chromeデベロッパーツールを使いこなそう

技術書典で良書を見つけたのでご紹介します。

Chromeデベロッパーツールを使いこなそう Console編
Chromeデベロッパーツールを使いこなそう Network編
Chromeデベロッパーツールを使いこなそう Elements編

ConsoleとNetworkの見方や使い方を知るとデバッグが捗るので読んで損はないと思います。

288
318
5

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
288
318