📖

はじめてのLaravel。デバッグをやってみよう。

に公開

はじめに

最近、Laravelの初学者にプログラミングを教えていると、デバッグをやったことがないという方が多いことに気が付きました。
既存のLaravelプログラマーからするとびっくりですが、AI全盛期の2025年現在、そういうのが当たり前の時代なのかもしれません。
そこでLaravelでのデバッグの基本の流れを解説いたします。

エラーが出たらまずはどこが問題なのかを特定しよう

例題
あなたはとある画面に表示された入力欄の値を、データベースに登録する処理を実装するように指示されました。
一応コーディングできたので画面の送信ボタンをクリックしてみましたが、何やらシステムエラーが起きています。
AIにエラー内容を聞いては提案をコピーするもまた別のエラー・・・いつまで経っても解決しません。
一体なにがダメなのでしょうか?

解決法
まずは作業をなるべく細かく分けて、確認ポイントを増やしましょう。
例題の場合であれば以下のように切り分けることが可能です。

  • bladeファイル(HTML)からControllerクラスへのルーティングは正しく紐づいているか。
  • Controllerクラスの対象メソッドに入力内容は届いているか
  • バリデーションは正しく機能しているか
  • ControllerクラスからModelクラスへ渡している値は正しいか
  • Modelクラスに設定しているテーブル名やカラム名は実際のデータベースのカラム名と一致しているか

まずはDBから合わせる

順番としてはまずデータベースのテーブル名やカラム名を仕様通りに合わせることを一番初めにやるべきです。
カラム名に合わせてクラス名や変数名も決まってくるため、ここが間違っていると全てやりなおしになります。
※仮に構文としては合っていて動いたとしても、データベースと関係ないカラム名などを変数名にすると極めて保守しずらい品質の悪いコードになります。
もしPMがコードレビューする案件の場合は突き返されます。
いない場合は・・・後日あなたが自分で何を書いたか分からなくなり発狂します。

リクエストを確認。ddの使い方

Controller内の確認方法としては、まずメソッドの始めでリクエストが届いているかを確認するため、変数の中身をダンプして表示します。
Laravelではddという関数を使うとオブジェクトの中身を一覧できるので、これでフォームに入力した内容が出揃っているか確認しましょう。

bladeファイルにこんなHTMLを書いていたとして、

blade
<form action="/user" method="POST">
  @csrf
  <input type="text" name="name" placeholder="名前を入力">
  <input type="email" name="email" placeholder="メールアドレスを入力">
  <button type="submit">送信</button>
</form>

コントローラでこんな風にdd関数を書くと

UserController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function store(Request $request)
    {
        // リクエストの中身を確認
        dd($request);
    }
}

そうすると、このようにその変数の中身が展開されて表示されます。

Request {#42
  +attributes: ParameterBag {#45 }
  +request: ParameterBag {#44
    #parameters: array:2 [
      "name" => "田中太郎"
      "email" => "taro@example.com"
    ]
  }
  ...
}

もしここでnameやemailといったキー自体が表示されないならHTMLのそのname属性を持つinputタグがないということです。
値がnullだったら未入力だったり、javascriptの記述が間違っていて上手く送信されていない、などが考えられます。

ダミーデータでDBに書き込めるか試す。

今度はモデルクラスの使い方が合っているか、DB接続がちゃんと出来ているかだけを動作確認します。

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function testInsert()
    {
        // ダミーデータを作成して保存
        $user = new User();
        $user->name = 'テスト太郎';
        $user->email = 'test@example.com';
        $user->password = bcrypt('password'); // パスワードは必ずハッシュ化します
        $user->save();

        // 保存できたかどうか確認
        return 'ユーザーを登録しました。';
    }
}

テスト実行方法
ルートファイル(routes/web.php)に、テスト用のルートを追加しておきましょう。

use App\Http\Controllers\UserController;

Route::get('/test-insert', [UserController::class, 'testInsert']);

これで、ブラウザから

http://localhost/test-insert

にアクセスすると、ダミーデータが1件、users テーブルに登録されるはずです。

登録できたか確認するには?
phpMyAdminやA5SQLなどのデータベースクライアントアプリで中身を直接見て、レコードが追加されているか確認します。

もしくは、LaravelのTinker(ターミナルでphp artisan tinker)を使って、

User::all();

と打てば、登録されたユーザー一覧が見られます。

今までのコードを繋げる

部分ごとの動作が確認出来たら、固定値で打っていた部分を動的にして一連の流れをつなげていきましょう。
通しで動作確認しても問題なければ修正完了です。

おわりに

いかがだったでしょうか。
デバックでやるべきことには他にもまだまだ使うべきツールや拡張機能、ログの出し方、ステップ実行のやり方などがあり、今回のものは初歩の初歩ですが、まずは1つやり方を覚えましょう。
このあたりの技術は1つ覚えるごとに開発スピードが数倍になり、かつ苦労は1つ覚えるごとに半減しますので、頑張って覚えていきましょう。

株式会社ONE WEDGE

【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp

Discussion