🩺

[Laravel] Laravelでできるいろいろなデバッグ方法

2022/01/17に公開

Laravelのデバッグヘルパー

Laravelには変数の中身を出力するデバッグヘルパーが存在します。
php標準の出力方法はほぼLaravelのデバッグ関数で代用できます。
出力が見やすいのでLaravelの開発では基本的にはphp標準よりこちらを使った方がよいでしょう。
コントローラーであろうがモデルであろうが、どこにでも書けます。

dump()

php標準のvar_dump()と同じく変数を出力するものです。
var_dump()よりリッチな見栄えで出力されます。

dd()

dump and dieの略です。
つまりこの関数を置いたところで処理が止まります。
そのため複数箇所の確認はできません。
とはいえLaravel開発ではリダイレクトが頻繁に使われるのでこの関数にはしばしばお世話になります。

補足: php標準のデバッグ

Laravelに関係ない話です。
変数や定数の内容を確認できるphpの標準関数や言語構造が存在します。
echo文やprint()関数、var_dump()関数などです。
上述のdd()やdump()はこれらを見やすく拡張したものです。
dump()のスタイルが邪魔になるときに使うとよいでしょう。

echo __LINE__; // 123
$this->publish_year = 2020;
$this->publish_month 3;
$this->publish_day 30;
$data['publish'] = sprintf('%04d-%02d-%02d', $this->publish_year, $this->publish_month, $this->publish_day);
print_r($data['publish']); //2020-03-30
var_dump($data['publish']); // string(10) "2020-03-30" 

tinker

Laravelに標準搭載されているREPL(レプル)です。
tinkerはpsyshのラッパーライブラリで、Laravelで使いやすいように拡張されています。
コードを実装する前や思ったとおりの出力にならない場合に確認する用途で使えます。

起動方法

ターミナルで下記コマンドを実行します。

php artisan tinker
Psy Shell v0.10.12 (PHP 8.0.10 — cli) by Justin Hileman
# Docker環境の場合
sail tinker
Psy Shell v0.10.12 (PHP 8.1.0 — cli) by Justin Hileman

実行

sail tinker
Psy Shell v0.10.12 (PHP 8.1.0 — cli) by Justin Hileman
>>> $a = 1 // 普通の変数の確認
=> 1
>>> ++$a
=> 2
>>> Headline::find(1) // ここからはLaravel特有です。モデルの内容を確認できます。
[!] Aliasing 'Headline' to 'App\Models\Headline' for this Tinker session.
=> App\Models\Headline {#4464
     id: 1,
     flag: 1,
     target: 1,
     publish: "2021-02-23",
     ...
>>> Str::startswith('abcdef', 'abc') // ヘルパーも使えます。
=> true
>>> Str::startswith('abcdef', 'dbc')
=> false

Logファザード

Laravelはログの保存機構を備えています。
出力先がブラウザではなくファイルなどのログになるので、画面が汚れません。
dump()やdd()と違い、引数に配列やオブジェクトは取れません
配列やオブジェクトをログに残す場合は、print_r()関数を使うとよいでしょう。
第2引数をtrueにすることで文字列を戻り値として取得します。

PHP: print_r - Manual

デフォルトでは「logs/laravel.log」ファイルに出力されます。

引数のidを出力

use Illuminate\Support\Facades\Log;

class AnnouncementCcontroller extends Controller
{
    // /admin/announcement/edit/200にアクセス
    public function edit($id)
    {
        Log::debug($id);
/*
laravel.logに以下が出力されます。
[2022-01-16 15:07:10] local.DEBUG: 200 
*/

Eloquentモデルの内容を出力

use Illuminate\Support\Facades\Log;

class HeadlineCcontroller extends Controller
{
    // admin/headline/edit/200にアクセス  
    public function edit($id)
    {
        $headline = Headline::findOrFail($id);
	// モデルオブジェクトはそのまま引数に渡せます。
        Log::debug($headline);
/*
laravel.logに以下が出力されます。
[2022-01-16 15:08:45] local.DEBUG: {"id":200,"flag":1,"target":3,"publish":"2020-03-30",...
*/

Laravel Debugbar

デバッグ情報をページ下部に表示させるツールです。

以下の内容を確認できます。

  • デバッグメッセージ
    \Debugger::debug()などのメソッドで変数などの内容を確認できます。
  • タイムライン
  • 例外
  • 出力に使用されたビュー
    routes/web.phpやコントローラーを見なくても参照されたビューを確認できます。
  • ルーティング設定(ミドルウェアも含みます)
  • 実行されたクエリ
    クエリを確認することでN + 1問題などの効率の悪いクエリが発行されていないかを設定できます。
  • 参照されたモデル
  • セッションオブジェクト
  • リクエストオブジェクト

準備

composerコマンドでインストールします。

composer require barryvdh/laravel-debugbar --dev

.envファイルを編集します。
APP_DEBUGもしくはDEBUGBAR_ENABLEDをtrueに設定します。

APP_DEBUG=true

# APP_DEBUGの設定と、Debugbarの設定を分けたいとき場合にはこちらをtrueに設定。
DEBUGBAR_ENABLED=true

emergencyからlogまでレベルごとのメソッドが揃っています。
使い分けることでデバッグバーでの分類がしやすくなります。

\Debugbar::emergency('emergency');
\Debugbar::alert('alert');
\Debugbar::critical('critical');
\Debugbar::error('error');
\Debugbar::warning('warning');
\Debugbar::notice('notice');
\Debugbar::info('info');
\Debugbar::debug('debug');
\Debugbar::log('log');
$inputs = new Headline();
\Debugbar::log($inputs);

先述のLogファザードの情報もmessageタブに表示されます。

Discussion