[Laravel] Laravelでできるいろいろなデバッグ方法
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にすることで文字列を戻り値として取得します。
デフォルトでは「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