【Laravel / PHP】デバッグ初心者が覚えるべきログ出力4選
Social Databank Advent Calendar 2025 の20日目です。
こんにちは!Chiharuです🪶
私は現在、新卒1年目で未経験からエンジニアに挑戦しています!
今回は、私がずっと苦戦している 「デバッグ」 についてお話しします。
コーディングをしていると、必ずと言っていいほど「なんでエラーが出るの?」「なんで思った通りに動かないの?」という壁にぶつかりますよね。
私自身も、エラーが出ている理由が分からず、長時間悩んでしまったことが何度もあります。
(今思うと、そのときはエラー文をちゃんと読まず、データの中身を見ることもせずに、ただコードを眺めて「分からない…」となっていました…)
そんなとき、先輩から「1回ログを仕込んでみて」とアドバイスをいだだき、言われた通りにログを仕込んでみると……
そもそもデータが入っていない!!
さらに追っていくと、エラー行の前のデータ受け渡しがうまくいっていないことが分かり、無事にエラーを解決できました。
このときに「ログを出すだけでこんなに分かるんだ…!」ととても衝撃を受けました。
ということで、今回は Laravel / PHP でよく使う「ログを使ったデバッグ方法」 についてまとめました。
デバッグに悩んでいる初心者エンジニアの参考になれば嬉しいです!✨
なぜログが大切なのか
プログラムを書いていると、コンピュータの中で何が起きているのか目に見えないという場面がたくさんあります。
- 「この変数に何が入っているの?」
- 「このメソッドにちゃんとデータ渡せてる?」
- 「処理はどこまで到達しているの?」
こういうときに使うのが、ログを仕込んで処理を「見える化」することです。
ログを出すと、「今ここまで動いてる」「この時点ではこの値が入ってる」みたいなことが分かるようになります!
Laravel / PHPでよく使うログ4選!
1. dd() - その場で処理を止めて確認
dd()は「Dump and Die」の略で、その場で処理を止めて、変数の中身を画面に表示してくれます。
特徴
- 処理がその場で止まる
- 配列やオブジェクトの中身が見やすい
- ブラウザで確認したいときに便利
$user = User::find(1);
dd($user); // ここで処理が止まり、$userの内容が画面に表示される
注意点
ループの中で使うと、最初の1回目で止まってしまいます。
// ❌ 1件目で止まる
foreach ($users as $user) {
dd($user);
}
// ⭕ 全件見たいなら、ループの外に書く
dd($users);
2. var_dump() - 型も確認できる
var_dump()は、変数の型と値を出力します。
特徴
- int / string などの型情報が分かる
- 処理は止まらない
「数字だと思ってたら文字列だった…」みたいなときに助かります。
$count = 10;
var_dump($count); // int(10)
$users = ['Alice', 'Bob'];
var_dump($users);
// array(2) {
// [0]=> string(5) "Alice"
// [1]=> string(3) "Bob"
// }
3. print_r() - 配列を見やすく出力
print_r()は、配列の中身を人が読みやすい形で表示してくれます。
特徴
- 配列構造が見やすい
- 型情報は出ない
$user = [
'name' => '太郎',
'age' => 25
];
print_r($user);
// Array
// (
// [name] => 太郎
// [age] => 25
// )
4. echo - シンプルに出力
echoは、文字列や値をそのまま出力します。
特徴
- 一番シンプル
- 「ここまで処理が来ているか」を確認するときに便利
echo "処理開始\n";
$status = "処理中";
echo "現在の状態: " . $status . "\n";
番外編
-
Log::info()
Laravelのログファイル(storage/logs/laravel.log)に出力できる
→ 本番環境でも使える -
console.log()
JavaScript用で、ブラウザのコンソールに表示される
実践:ログを使った問題解決
例えば、以下のコードでこんなエラーが出たとします。
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'email' cannot be null
public function register(Request $request)
{
$userData = $request->all();
$user = User::create($userData); // ここでエラー!
return redirect('/home');
}
Step 1: どこまで到達しているか確認
public function register(Request $request)
{
echo "1. 処理開始\n";
$userData = $request->all();
echo "2. リクエストデータ取得\n";
$user = User::create($userData);
echo "3. ユーザー作成完了\n";
return redirect('/home');
}
「2」までは出るけど「3」が出ない場合
→ User::create()でエラーが起きていることが分かります。
Step 2: データの中身を見る
$userData = $request->all();
dd($userData); // どんなデータが来ているか確認
必要なデータがちゃんと入っているか確認できます。
Step 3: 問題を特定して修正
ログを見て、「emailが入っていない」と分かったら、バリデーションやフォームを修正します。
ログを仕込むときのコツ
とりあえず出してみる
最初は「正しいログの出し方」は気にせず、いろいろ試してみて使えるものを使いました!
- ログが出る:そこまで処理が到達している
-
ログが出ない:そこまで到達していない
→ 条件分岐に入っていなかったり、それより前の段階で問題が起きている可能性がある
自分にとって分かりやすい形で仕込む!
// ❌ 何のログか分からない
echo $data;
// ⭕ これなら一目瞭然
echo "⭐️⭐️⭐️送信データを確認⭐️⭐️⭐️\n";
print_r($data);
最初は1行ごとに出力する
慣れないうちは、1行書いたらログを出すを実践しました!
ログの量を減らしたり、適切に仕込むのは、ログともっと仲良くなってから意識しようと考えています。
ログを出した後は
-
データ型や変数名を確認する
var_dump($count)で型をチェックして、違っていたらキャスト(例:(int)$count)やメソッドを変更します。
キャメル・スネークケースや、単数・複数形のうっかり間違いも多いので要チェックです。 -
メソッドや関数が適切か調べる
使っているメソッドが、そのデータ型で使えるのか確認してみましょう。 -
エラーメッセージをちゃんと読む
エラーメッセージをそのまま検索してみると、同じところで詰まっている人にたくさん出会えます!
先人たちのブログや公式ドキュメントで調べると、解決できることが多かったです。
まとめ
- まずは
dd()、var_dump()、print_r()、echoの4つを使ってみる - 1行ずつログを仕込んで確認していけば、原因に近づける
- ログが出ない = そこに到達していない
私も最初は全然うまくいかなかったのですが、今ではかなりログに助けられています。
試行錯誤しながら、一緒にログと仲良くなっていきましょう!🔥
Discussion