【もう迷わない】プログラミングスクールをポイント別に紹介

Laravelのデバッグ方法6パターン解説!実務で使えるLaravelをマスター

Laravelでデバッグする方法が知りたいな…

こんな疑問を解決します。

私は現役エンジニアとして、実務でLaravelを使っています。

そんな私が開発しているときによく使うLaravelのデバッグ方法について6パターン解説。

ぜひ参考にしてくださいね!

本記事のゴール
  • Laravelのデバッグ方法がわかる
  • dd関数やdump、Log::debugの使い分けがわかる
Contents

動作確認した環境

Docker 20.10.7
PHP 7.4.22
Laravel 8.53.1
mySQL 5.7
データベースのツール phpmyadmin

前提

本を管理するアプリを想定します。
一覧画面と登録画面はこんな感じです。
スクリーンショット 2021-08-30 21.06.38.png
スクリーンショット 2021-08-30 21.06.46.png

【Laravelデバッグ①】dd関数を使う

私が実務でデバッグするときによく使います。
リクエストされた変数の値を確認する際に用いますね。

実際には以下のように確認します。

例えば登録フォームでリクエストの変数を確認する想定です。

   /**
     * 登録処理
     */
    public function store(BookRequest $request)
    {
        // リクエストされた本の名称
        $bookName = $request->book_name;
        // dd関数を用いて、$bookNameの値を確認する
        dd($bookName);
        // リクエストされたデータを元に登録処理を実行
        $registerBook = $this->book->InsertBook($request);
        return redirect()->route('book.index');
    }
@extends('layouts.app')

@section('content')
<div class="container small">
  <h1>本を登録</h1>
  <form action="{{ route('book.store') }}" method="POST">
  @csrf
    <fieldset>
      <div class="form-group">
        <label for="book_name">{{ __('本の名称') }}<span class="badge badge-danger ml-2">{{ __('必須') }}</span></label>
        <input type="text" class="form-control {{ $errors->has('book_name') ? 'is-invalid' : '' }}" name="book_name" id="book_name">
        @if ($errors->has('book_name'))
          <span class="invalid-feedback" role="alert">
            {{ $errors->first('book_name') }}
          </span>
        @endif
      </div>
      <!--  カテゴリープルダウン -->
      <div class="form-group">
        <label for="category-id">{{ __('カテゴリー') }}<span class="badge badge-danger ml-2">{{ __('必須') }}</span></label>
        <select class="form-control" id="category-id" name="category_id">
            @foreach ($categories as $category)
                <option value="{{ $category->category_id }}">{{ $category->category_name }}</option>
            @endforeach
        </select>
      </div>
      <div class="d-flex justify-content-between pt-3">
        <a href="{{ route('book.index') }}" class="btn btn-outline-secondary" role="button">
            <i class="fa fa-reply mr-1" aria-hidden="true"></i>{{ __('一覧画面へ') }}
        </a>
        <button type="submit" class="btn btn-success">
            {{ __('登録') }}
        </button>
      </div>
    </fieldset>
  </form>
</div>
@endsection

ビューはこんな感じです。

登録ボタンが押された時に登録処理が走ります。

フォームにテストと入力して登録ボタンを押すと、コントローラーのstoreメソッドが走ります。
storeメソッド内にdd関数を書いているため、dd関数が読まれたら処理を止まります。

スクリーンショット 2021-08-30 21.13.16.png

このようにdd関数で$bookNameの値が確認できます。

今回は$bookName = $request->book_nameという簡単な値の確認でしたが、登録処理をdd関数で確認したい場合も同様にできます。

    /**
     * 登録処理
     */
    public function store(BookRequest $request)
    {
        // リクエストされた本の名称
        $bookName = $request->book_name;
        // リクエストされたデータを元に登録処理を実行
        $registerBook = $this->book->InsertBook($request);
        // dd関数を用いて、$registerBookの値を確認する
        dd($registerBook);
        return redirect()->route('book.index');
    }

$registerBookは登録処理を表しています。

同じようにフォームに入力して登録ボタンを押すと、登録処理であるstoreメソッドが呼ばれてdd関数のところで処理が止まります。

確認すると今度は以下のように少し複雑になります。

スクリーンショット 2021-08-30 21.16.28.png

ずらずらと項目がありますが、attributesのところにフォームで入力した内容を確認できます。

【Laravelデバッグ②】var_dump

dd関数は途中で処理を止めますが、var_dumpは処理を止めずにデバッグします。

var_dump($変数);
とかけばデバッグできます。

【Laravelデバッグ③】dump

dumpはddと異なり、処理は止めずにデバッグができます。

また、var_dumpのデバッグは見にくいですが、dumpならdd関数のように背景が黒くなって変数を確認できるので、var_dumpより見やすいです。

処理を止めて確認したい場合は、dd関数、処理を止めたくない場合はdump関数を使いましょう。

【Laravelデバッグ④】Log::debugでログを出力する

Laravelが標準で用意しているLog::debugも便利です。

だいたいはdd関数でデバッグできるのですが、dd関数はajax処理と相性良くないです。

なぜなら、ajax処理は非同期通信で処理を止めたくないのに、dd関数を使うと処理が止まって正常に処理が行われません。

ajax処理中にdd関数があると、デバッグもできないです。

そこで、Log::debugの出番です。

処理は止まりませんし、ログに出力できるので便利。

さて実際に確認していきましょう。

まずはLog::debugを使えるようにLogファザードを追加します。
use Illuminate\Support\Facades\Log追加

<?php

namespace App\Http\Controllers;

use App\Models\Book;
use App\Models\Category;
use Illuminate\Http\Request;
use App\Http\Requests\BookRequest;
use Illuminate\Support\Facades\Log;←追加してください

class BookController extends Controller
{

    public function __construct()
    {
        $this->book = new Book();
    }

    /**
     * 登録処理
     */
    public function store(BookRequest $request)
    {
        // リクエストされた本の名称
        $bookName = $request->book_name;
        // デバッグ
        Log::debug($bookName);
        // リクエストされたデータを元に登録処理を実行
        $registerBook = $this->book->InsertBook($request);
        return redirect()->route('book.index');
    }

    /**
     * Ajax通信で本を検索
     */
    public function getBooksBySearchName($bookName)
    {
        $books = $this->book
                      ->where('book_name', 'like', '%'.$bookName.'%')
                      ->orderBy('book_id', 'asc')
                      ->get();        
        return response()->json($books);
    }
}

こんな感じで、デバッグしたいところにLog::debug(値)みたいに書きます。

すると、storage>logs>laravel.logに以下のようにログが出力されます。
スクリーンショット 2021-08-30 21.52.17.png

また、\Log::debug($bookName);と先頭に\をつければ、コントローラーの冒頭にLogファザード(use Illuminate\Support\Facades\Log;)を付けなくてもLogが出力できます。

ちなみに今回はコントローラーにajaxの処理を書いているのでついでにデバッグします。
検索フォームに文字を入力し、画面遷移せずにajax処理で一致するブック名の検索を行います。
※検索アイコンをクリックすると非同期通信が発動する仕様です。
スクリーンショット 2021-08-30 21.58.40.png
スクリーンショット 2021-08-30 21.58.50.png

    /**
     * Ajax通信で本を検索
     */
    public function getBooksBySearchName($bookName)
    {
        $books = $this->book
                      ->where('book_name', 'like', '%'.$bookName.'%')
                      ->orderBy('book_id', 'asc')
                      ->get();
        dd($books);
        // Log::debug($books);
        return response()->json($books);
    }

dd関数でデバッグすると、処理は実行できずajaxの処理も実行されません。

しかしLog::debugを使えば、ajaxの処理も正常に動きますし、ログも出力できます。

    /**
     * Ajax通信で本を検索
     */
    public function getBooksBySearchName($bookName)
    {
        $books = $this->book
                      ->where('book_name', 'like', '%'.$bookName.'%')
                      ->orderBy('book_id', 'asc')
                      ->get();
        // dd($books);
        Log::debug($books);
        return response()->json($books);
    }

storage>logs>laravel.log

[2021-08-30 12:57:06] local.DEBUG: [{"book_id":7,"user_id":null,"category_id":null,"book_name":"Laravel\u767b\u9332\u51e6\u7406\u306e\u30c6\u30b9\u30c8","created_at":"2021-08-12T05:51:05.000000Z","updated_at":"2021-08-12T05:51:05.000000Z"}]  

dd関数とLog::debugを使いこなせばだいたいのエラーは解決できると思います。

【Laravelデバッグ⑤】デバッグツールを導入する

デバッグしやすいようにデバッグツールを導入することもおすすめします。

あくまでも基本はddやLog::debugですが、補助的なデバッグとして活用してください。

$ composer require barryvdh/laravel-debugbar

これで以下のようにデバッグバーが導入できます。
スクリーンショット 2021-08-30 22.05.01.png

色々と項目があるので、開発しながら覚えましょう。
エラーが起きたら、一番左の項目のMessagesにエラーが出ます。
先ほど追加したLogファザード(use Illuminate\Support\Facades\Log;)を書き忘れたとします。
スクリーンショット 2021-08-30 22.06.59.png
エラーが出てますね。

このようにエラー解決を早くできるようにデバッグ関数やツールを活用していきましょ〜

【Laravelデバッグ⑥】tinkerを使う

tinkerの一番のメリットは、その場でPHPやLaravelの文を実行して結果を表示できること。

まずはアプリがあるディレクトリでphp artisan tinkerと打ちましょう。

/var/www/html/laravel_test_app# php artisan tinker
Psy Shell v0.10.8 (PHP 7.4.22 — cli) by Justin Hileman
>>> 

するとこのように>>>が現れて、対話形式で変数などを確認できます。tinkerから抜けるときはexitを打てばオッケーです。

/var/www/html/laravel_test_app# php artisan tinker
Psy Shell v0.10.8 (PHP 7.4.22 — cli) by Justin Hileman
>>> exit
Exit:  Goodbye

【実際の使い方】

それでは実際にtinkerの使い方について簡単に紹介します。

/var/www/html/laravel_test_app# php artisan tinker
Psy Shell v0.10.8 (PHP 7.4.22 — cli) by Justin Hileman
>>> echo ("hello");
hello

モデルの確認

私の場合は、Book.phpのモデルがあり、データベースにも以下のようにデータが挿入されています。

このときにBookモデルからid=1のデータを確認したいってときに以下のように実行することで確認できます。

/var/www/html/laravel_test_app# php artisan tinker
Psy Shell v0.10.8 (PHP 7.4.22 — cli) by Justin Hileman
>>> Book::find(1)
[!] Aliasing 'Book' to 'App\Models\Book' for this Tinker session.
=> App\Models\Book {#3502
     book_id: 1,
     user_id: 1,
     category_id: 1,
     book_name: "oXTDZ",
     created_at: null,
     updated_at: null,
   }

また、コードでわざわざ書くのはめんどいけど、PHPの関数などを確認したいってときにも使えます。

/var/www/html/laravel_test_app# php artisan tinker
Psy Shell v0.10.8 (PHP 7.4.22 — cli) by Justin Hileman
>>> mb_strlen("tinkerTests");
=> 11
/var/www/html/laravel_test_app# php artisan tinker
Psy Shell v0.10.8 (PHP 7.4.22 — cli) by Justin Hileman
>>> $carbon = new Carbon\Carbon();
=> Carbon\Carbon @1631935257 {#3502
     date: 2021-09-18 03:20:57.041805 UTC (+00:00),
   }
>>> $carbon->now()->format("Y/m/d");
=> "2021/09/18"

このようにtinkerを使えばサクッと変数の確認などができるので合わせて覚えておきましょう!

【まとめ】Laravelのデバッグ方法

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

デバッグはそれぞれの状況に合わせて有効活用していきましょう。

Laravel初心者の方もデバッグを覚えれば、効率よく勉強ができると思います。

コメント

コメントする

CAPTCHA


Contents
閉じる