副業におすすめなサイトを見る→

Laravelのデバッグ方法6パターン解説!bladeで使う場合も解説

Laravelのデバッグ方法6パターン解説!bladeで使う場合も解説

アプリリリースのお知らせ

予定を探すアプリyoteipickerをリリースしました。

アプリの利用用途:暇だから何か予定入れたいけど今週の土日は何しようかな〜?ってときに使えるアプリです。

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

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

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

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

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

本記事のゴール
  • Laravelのデバッグ方法がわかる
  • dd関数やdump、Log::debugの使い分けがわかる
  • bladeでデバッグするときはどうすればいいのかわかる

>>ココナラと似てるおすすめの副業サイトを確認する

>>リモートワークもあるおすすめの転職サイトを確認する

休日で空いた時間の暇つぶしを探せるアプリを公開しています。

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($変数);
とかけばデバッグできます。

    public function index()
    {
      $bookName = 'Laravel勉強会';
      var_dump($bookName);
    }

出力結果:string(16) “Laravel勉強会”

【Laravelデバッグ③】dump

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

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

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

    public function index()
    {
      $bookName = 'Laravel勉強会';
      dump($bookName);
    }

出力結果:”Laravel勉強会”

【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を使えばサクッと変数の確認などができるので合わせて覚えておきましょう!

bladeテンプレートでデバッグする場合は?

bladeテンプレートでビューにどんな値が来ているのかデバッグしたい時もありますよね。

そんなときは、dd関数を@php…@endphpで囲います。

@php
    dd($event->title);
@endphp

Log::debugを使う場合は、\Log::debugと書きます。

@php
    \Log::debug($event->title);
@endphp

Log::debugの場合は、storage/logs/laravel.logに以下のように表示されます。

[2021-11-27 00:05:04] local.DEBUG: タイプスクリプト勉強会

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

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

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

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

>>ココナラと似てるおすすめの副業サイトを確認する

>>リモートワークもあるおすすめの転職サイトを確認する

休日で空いた時間の暇つぶしを探せるアプリを公開しています。

スキルを売り買いするならココナラ

コメント

コメントする

CAPTCHA


Contents
閉じる