Laravel のデバッグ方法についてのご紹介

はじめに

こんにちは、AITPの壱岐です。
AITPではLaravelを使用したプロジェクトがいくつかあります。

今回はLaravelのデバッグ方法について紹介します。

DockerコンテナにVSCodeをアタッチして開発する際の設定等を纏めた記事(DockerコンテナにVSCodeをアタッチして使用する方法の紹介) も良ければ御覧ください。

前提条件

  • Laravelの開発環境が構築済みであること
    • PHP自体のデバッグ方法についても紹介しますが当記事内ではDocker上で環境構築されており、VSCodeを使用する前提でご紹介します
    • 画面キャプチャをいくつか載せていますが、Laravel10.xのバージョンのものとなります 違うバージョンの場合、多少表示が異なるかと思いますのでご了承ください

dump / dd(dump die) / ddd(dump die debug)

Laravelの簡単なデバッグの方法として、dump()/dd()/ddd()を使う方法があります。 それぞれ下記のような表示になります。好みや都合の良い方法を選んで使ってください。

dumpの場合

ページの上部にdump()に指定した内容 + Viewを返していればViewを表示します。

ddの場合

dd()で指定した内容だけが表示され、Viewは表示されません。

dddの場合

エラーページ(Ignitionページ)に加え、リクエスト等の情報、ddd()で指定した内容等の表示がされます。(dd()の上位互換とも言える機能です。)

StackTrace
リクエスト等の情報
ddd()で指定した内容やその地点までに発行されたクエリ等

Logとして出力する

日本語ドキュメント: https://readouble.com/laravel/10.x/ja/logging.html

次に簡単なデバッグ方法としてログを流して確認する方法があります。

<?php

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);

ログはデフォルトの設定であればstorage/logs/laravel.logに出力されます。

tail -f storage/logs/laravel.log等のコマンドでログを流しながら確認したり、 先述のddd()のデバッグ画面や後述のDebugbarにも表示されるので、そこから確認できます。

ddd() 使用時に表示されるログ

storage/logs/laravel.logには.env内のLOG_LEVELの設定値以上のものだけがエラー出力されるため、例えば本番環境ではwarningに設定、開発環境ではdebugに設定しておくのが良いと思います。

Debugbarを設定する

GitHubリポジトリ: https://github.com/barryvdh/laravel-debugbar

Debugbarを導入することで、デバッグを行うのに必要な様々な情報を表示することができます。

(↓ページ内にデバッグ情報が表示され、Queriesタブでは実行されたクエリや、それにかかった時間、重複しているクエリ等の情報が表示されます)

Queriesタブの表示

導入は下記のようにComposerでインストールします。

$ composer require barryvdh/laravel-debugbar --dev

.envで DEBUGBAR_ENABLED または APP_DEBUGの値をtrueにすることでデバッグバーが表示されます。 (APP_DEBUGは他のデバッグ用のフラグとしても使用されるため、専用のフラグであるDEBUGBAR_ENABLED の設定値の方が優先されます。)

また、下記コマンドで設定用のファイルをconfig/debugbar.phpとして作成することができます。 (内容は https://github.com/barryvdh/laravel-debugbar/blob/master/config/debugbar.php のものが作成されます。)

$ php artisan vendor:publish --provider="Barryvdh\\Debugbar\\ServiceProvider"

config/debugbar.phpのファイルのそれぞれの設定値毎にコメントで説明がありますので、お好みで設定を変更して使ってください。

PHPのデバッガを設定する

PHP自体のデバッグにはxdebugとVSCode拡張機能のPHP Debugを使用します。

xdebugがコンテナにインストールされていない場合、コンテナ内で以下のコマンドでインストールします。

# xdebugのインストール
$ pecl install xdebug

# xdebugの有効化
$ docker-php-ext-enable xdebug

チーム開発を行っている場合でインストールされていない場合、新規参画者の手順を減らしたり、コンテナ再作成時の手順を減らすためにDockerfileにインストールのステップを追記するのも良いかと思います。

php.ini ファイルには以下の内容を追記します。(コンテナーにvi等インストールされていない場合、VSCode上から操作していれば、Ctrl + Oで名前を指定してファイルを開いて編集できます。また、conf.d配下のiniファイルも読み込む設定となっていればxdebug.iniとして専用のファイルを作成するのも良いと思います。)

# php.iniファイルの配置場所確認
$ php -r "echo phpinfo();" | grep "php.ini"
$ vi /usr/local/etc/php/php.ini    # パスは上記で確認したものに置き換えてください

[xdebug]
xdebug.client_host = host.docker.internal
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.discover_client_host = 0
xdebug.client_port = 9000   # ポート番号は後述のPHP Debugと合わせる(他で使用していないポート番号を使用する)

(こちらも最初からxdebugを使用することがわかっていればphp/conf.d配下にxdebug.ini等の名前でマウントさせておくと良いと思います。)

iniファイルを書き換えた後は再度読み込みが必要になるためdocker restart {containerName} でコンテナを再起動します。

VSCodeにはPHP Debugの拡張機能をインストールします。

PHP Debugの設定ファイルとして.vscode/launch.jsonファイル(ない場合は作成)に以下の内容を記述します。

{
    "configurations": [
        {
            "name": "XDebug on docker",
            "type": "php",
            "request": "launch",
            "port": 9000,
        }
    ]
}

その後、任意の行にブレークポイントを設定した上で、F5キーでデバッグを開始しブレークポイント設定した行が動くとその箇所で止めることができ、デバッグタブから変数の確認やウォッチ式の設定ができます。

おわりに

以上となります。
それぞれのタイミングに合ったデバッグ方法を活用し、効率よく開発を進めていきましょう!

関連するタグ