Laravelデバッグメソッド・ツールまとめ&小ネタ集

こんにちは。SCOUTERでエンジニアインターンをしている池谷と言います。
バックもフロントも書いてます。

SCOUTERでは、サーバーサイドはPHPを使って開発していますが、特にLaravelをフレームワークとして採用することが多いです。 Laravel、いいですよね。コレクションは便利だし、ORMもシンプルで使いやすいです。
今回はLaravelのデバッグ方法まとめと、ちょっとした小ネタを紹介しようと思います。

ロギング

ログ出力しないとデバッグは始まりませんね。 Laravelでは便利なlogger(), info()といったヘルパーメソッドが用意されてます。 デフォルトでは、storage/logs/laravel.logに出力されます。

logger("サーバーサイドエンジニア募集中");
info(['フロントエンドも募集中', '募集中']);
[2017-06-30 13:40:35] local.DEBUG: サーバーサイドエンジニア募集中
[2017-06-30 13:41:30] local.INFO: array (
  'フロントエンドも募集中',
  '募集中'
)  

募集中ということがよく伝わるロギングができました。
これ、Logファサードをグローバルヘルパにしただけなので、もちろんファサードを使っても実現できます。

\Log::debug("エンジニア募集中");
[2017-06-30 13:45:21] local.DEBUG: エンジニア募集中

ちなみに、そのままだとオブジェクトは出力不可能です。でも出力したいんだぜという人はprint_rを組み合わせるといい感じに出力されます。
PHP職人の方にはよく知られた方法ですね。

logger(print_r($object, true));

ロギングではないですがヘルパ関数でいうとdump and dieもよく使います。
変数だろうがオブジェクトだろうが、スクリプトを停止した上で、綺麗にブラウザ等に出力してくれます。

dd($request);

デバッグツール

Laravelには便利なデバッグツールが用意されてます。

laravel-debugbar

Laravelデバッグにおける神ツール。知らない人は是非インストールしておきましょう。
具体的なインストール・設定方法はSCOUTER社の別のエンジニアが個人ブログで紹介しているのでそちらをご覧ください笑

larapet.hinaloe.net

f:id:yoshiki-ikegaya:20170704120512p:plain こんな感じのデバッグバーがブラウザの画面下に出てきます。 使ったRouteやクエリやAuth、laravel.logの表示までやってくれます。tailとはなんだったのか。

tinker

f:id:yoshiki-ikegaya:20170704125131p:plain
tinkerとは、Laravel専用のREPLツールです。対話型実行環境というやつです。 psyshというPHPでよく使われるREPLツールをラップして作られています。 railsrails cにあたります。モデルとかの検証に便利ですね。

$ php artisan tinker

Psy Shell v0.8.1 (PHP 7.0.19 — cli) by Justin Hileman
New version is available (current: v0.8.1, latest: v0.8.8)
>>>
>>>
>>>
>>> App\Models\User::all()
=> Illuminate\Database\Eloquent\Collection {#752
     all: [
       App\Models\User {#753
         id: 1,
         name: "Test User",
         created_at: "2017-02-12 13:00:28",
         updated_at: "2017-02-12 13:00:28",
       },
       App\Models\User {#754
         id: 2,
         name: "Yoshiki Ikegaya",
         created_at: "2017-07-03 23:34:25",
         updated_at: "2017-07-03 23:38:09",
       },
     ],
   }
>>>

はい。

実は意外と知られていませんが、tinkerはブレークポイントを使ったデバッグに対応してます。
ソースコード内でブレークポイントを置いておけば、そのタイミングでスクリプトが自動で停止し、tinkerが起動してそこから対話型でデバッグできるというものです。
Railsの開発経験のある方は、binding.pryを使ったことがあると思います。あれです。

適当なcontrollerを作って、

eval(\Psy\sh());

というブレークポイントを設置し、
?message=laravelというクエリをつけてアクセスしてみると…

$ php artisan serve
Laravel development server started on http://127.0.0.1:8000/

Psy Shell v0.8.1 (PHP 7.0.19 — cli-server) by Justin Hileman
PHP 7.0.19 Development Server started at Tue Jul  4 11:36:53 2017
Listening on http://127.0.0.1:8000
Document root is /Users/ikegaya/develop/mercury/public
Press Ctrl-C to quit.
>>>
>>>
>>> whereami
    30|      *
    31|      * @return \Illuminate\Http\Response
    32|      */
    33|     public function index(Request $request)
    34|     {
  > 35|         eval(\Psy\sh());
>>>
>>>
>>> $request->message
=> "laravel"

はい。php artisan serveが途中で止まり、tinkerが起動しています。
そこまでで定義した変数とかも自由に使えることがわかります。

実はこれはtinkerのラップ元のpsyshの機能として動いています。
psyshの機能はtinkerでももちろん使うことができるのですが、それを知らずに単なる対話ツールとして使う人が多いようです。
他にもいろんな機能があるので、是非チェックしてみてください。

http://psysh.org/

ビルトインサーバ使用時にしかこのデバッグはできないようなのでご注意ください…

まとめ

Laravel上でできるデバッグツールや小ネタを紹介してみました。

もしまだ試していないTipsなどがございましたら是非試してみてください。 よきLaravelデバッグライフを!

さいごに

弊社SCOUTERではLaravel / Reactを使ってサービスを展開しております。

興味のある方、ご応募お待ちしております!

www.wantedly.com

www.wantedly.com