【Laravel】Webアプリ開発のデバッグ手法
はじめに
Laravelで開発を進めていると、予期せぬ動作やエラーに遭遇することは避けられません。
そこで重要になるのがデバッグ方法です。
本記事では、Laravelエンジニアのため実践的なデバッグ手法をまとめます。
対象者
- Laravelを使ってWebアプリを開発している方
- 効率的にエラーを発見・解決したい方
- 様々なデバッグ方法を知りたい方
状況別おすすめデバッグ方法
状況 | 推奨方法 |
---|---|
ログ追跡 |
Log ファサード + tail コマンド |
開発中の画面バグ確認 |
dd() , dump()
|
例外が出ている箇所の視認 | ddd() |
複雑な処理の逐次確認 |
Xdebug + IDE |
Log
ファサード + tail
コマンドでログ追跡
Laravelアプリケーションで、コードにLog
ファサードのinfo
メソッド等を仕込むことで、任意のポイントでログ出力を行うことができます。
そして、サーバー側でtail
コマンドを使うことで、そのログファイルの最新の出力をリアルタイムに追跡することができます。
ステージング環境においては、リアルタイムにログを確認することで不具合検知に役立ちます。
そして、本番環境などで dd()
が使えない場面では、Log
ファサードが特に有効な手段です。
Log
ファサード の使い方
コード例:
use Illuminate\Support\Facades\Log;
Log::info("[web.php][user]");
Log::info(json_encode($user, JSON_PRETTY_PRINT));
ログレベルの使い分け
ログ出力時には、ログレベル(info, warning, errorなど)を適切に使い分けることも大切です。Laravelでは次のようなログレベルを使用できます。
- info:通常の動作記録やデバッグ用
- warning:問題はあるが処理続行可能な警告
- error:処理不能な重大エラー
ログレベルを正しく使い分けることで、本番環境の運用監視時に「緊急性の高いログだけを素早く確認する」「問題の深刻度に応じた優先順位付けをする」といったことが容易になります。
ログレベル例:
Log::info('通常処理の記録');
Log::warning('想定外の入力を検知');
Log::error('データベース接続失敗');
tail
コマンドの使い方
ターミナルからログを追跡するには、次のコマンドが便利です。
tail -f storage/logs/laravel.log
tail
コマンドオプション(最新100行)
ログを追跡する際には、直近のログだけを追跡し始めたいこともあります。そんな時は次のオプションが便利です。
これにより、最新100行だけを取得して、その後の追記もリアルタイムに追跡できます。大量ログの出力による見づらさを防ぐのに役立ちます。
tail -n 100 -f storage/logs/laravel.log
dd() で処理を中断して確認
dd()
は「dump and die」の略です。
dd($value);
をソースコード内に入れ込むで、処理を強制終了して単一の変数の中身を確認できます。
dd($value);
dd()の複数引数指定
dd()
は複数の引数を指定することもでき、複数の変数やオブジェクトをまとめて出力できます。
これにより、関連情報を一度に把握しやすくなります。
例:
$user = ['name' => 'xxx', 'email' => 'xxx@example.com'];
$product = ['title' => 'yyy'];
dd($user, $product);
出力例:
array:2 [
"name" => "xxx"
"email" => "xxx@example.com"
]
array:1 [
"title" => "yyy"
]
特定のキーだけ取り出して確認する
大きな配列やオブジェクトから一部だけを取り出して確認したい場合、必要なキーにアクセスしてからdd()
またはdump()
を使うと効率的です。
dd($user['email']);
出力例:
"xxx@example.com"
ddd() でエラー画面に整形出力
Laravel独自の ddd()
ヘルパーを使うと、標準のWhoopsエラー画面上に変数情報を整形して表示できます。
Laravel Debugbarやspatie/laravel-rayといったツールと併用するとさらに効果的です。
ddd($value);
dump() で処理を止めずに確認
dd()
とは違い、dump()
は処理を中断せずに変数の中身を出力します。ループ中や後続処理の検証にはこちらが適しています。
これはSymfonyのVarDumperコンポーネントを用いて整形されたHTMLで出力され、視認性にも優れています。
dump($value);
dump($value1, $value2, $value3);
PHPデバッグツール「Xdebug」
dd/dump
手法との違い
Xdebugとdd()
やdump()
はコード上に記述して変数の中身を表示する単発的なデバッグ方法ですが、XdebugはIDEと連携して、実行中の任意のタイミングで、任意の場所の変数・スタック・オブジェクト情報を逐次確認できる強力な手法です。
-
dd()
やdump()
は静的な出力のみ - Xdebugは実行フローを止め、分岐前後の状態比較やループ内の繰り返し検証も可能
特に複雑な条件分岐やループを含む処理では、Xdebugによるデバッグが圧倒的に有利です。
PHP開発で定番の「Xdebug」を使えば、ステップ実行や変数の中身の可視化が可能です。ブレークポイントによる細かなデバッグ制御ができ、複雑なロジックの解析に役立ちます。
環境構築(例: VS Code)
-
xdebug
をインストール -
.vscode/launch.json
に設定を追加 - ブラウザ拡張「Xdebug helper」を有効化する
例えば、任意の行にブレークポイントを置き、リクエスト時にその行で一時停止し、変数やスタック情報を確認することが可能です。これにより、想定外の挙動を効率よく追跡できます。
本番環境でdd/dumpを残さないための対策
安全なリリース運用のため、デバッグコードの取り扱いには注意が必要です。
対策として、次のような方法があります。
- コードレビュー時に必ず確認する
- VS Code拡張機能「Laravel Extra Intellisense」などでdd()/dump()検出をアラート設定する
- デプロイ前にgrepコマンドで一括検索して確認する
grep -r "dd(" ./
おわりに
私自身、Laravelの開発中にデバッグを疎かにしていた時期がありました。特に、些細なエラーもAIに頼ってしまい、かえって時間がかかってしまった経験もあります。AIは確かに強力なツールですが、環境特有の制約や前提を常に理解した上で答えてくれるわけではありません。
エンジニア自身が基本的なデバッグ手法を身につけておくことは、開発の効率化につながります。今回ご紹介した方法で、些細なミスやケアレスミスに自力で気づける場面が増えました。
AIと共存するこれからの時代だからこそ、自分の手で問題を整理し、状況を把握できるスキルがより一層重要になると思います。
本記事で紹介したデバッグ手法を、日々の開発にぜひ役立てていただければ幸いです。
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】
ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion