むにえる牧場

毎日むにえるをつくっています

【Laravel】tinxを使ってデバッグを手速く行う

はじめに

Laravelで開発をしている際に、メソッドのテストを行いたくなりました。
そんなときにRubyでいうirbのようなものがあったら良いなと思って呟いたところtinxを紹介してもらいました。

とても便利なツールで、DBのレコード確認や、デバッグが手速く行えます。
私がまだLaravelでの開発に慣れてないからというのもあるのですが、try & errorを細かく繰り返さないとコーディングができないので、こういったツールは本当にありがたい……

f:id:jalemy:20190607001514g:plain
Tinx実行サンプル

Tinx

github.com

Tinxとは

Tinkerのラッパーのようなツールです。
Tinkerの機能に加えて、

  • セッションのリロード
  • first(), where()などのメソッド
  • モデルに対してのalias

と機能がついてます。

Tinxのインストール

dockerでworkspaceコンテナに入って、composerでインストールできます。

~# composer require --dev ajthinking/tinx

Tinxの使い方

同じくdockerでworkspaceコンテナに入って、以下のコマンドを実行することでTinxを起動できます。

~# php artisan tinx

起動すると、下記のように接続しているDBのテーブルが表示されます。

+-------------+--------------+
| Class       | Shortcuts    |
+-------------+--------------+
| App\Article | $a, $a_, a() |
| App\Blog    | $b, $b_, b() |
| App\Comment | $c, $c_, c() |
| App\Like    | $l, $l_, l() |
| App\User    | $u, $u_, u() |
+-------------+--------------+

レコードの確認

例えば、上記のようなDBのときにArticleモデルのレコードが欲しい時はこんな感じ。
レコードが見やすく表示されるので便利です。

>>> App\Article::first()
=> App\Article {#3067
     id: 1,
     title: "hogehoge",
     content: "hogefugapiyopiyo~~",
     created_at: "2019-06-06 23:39:33",
     updated_at: "2019-06-06 23:39:33",
     is_draft: 0,
     blog_id: 1,
   }
>>>

メソッドの確認

Blogモデルに対して、こんなscopeを生やしているのですが、

class Blog extends Model
{
    ~省略~

    public function scopeUrlEqual($query, $str)
    {
        return $query->where('url', $str);
    }
}

tinx上で実行して実行結果を見ることができます。
開発している上でterminal上で確認できるのが本当に便利……

>>> App\Blog::UrlEqual('fugafuga')->get()
=> Illuminate\Database\Eloquent\Collection {#3066
     all: [
       App\Blog {#3064
         id: 1,
         title: "hogehoge",
         url: "fugafuga",
         created_at: "2019-06-06 23:39:05",
         updated_at: "2019-06-06 23:39:05",
         user_id: 1,
       },
     ],
   }

Tinxの便利なところ

モデルに対してaliasが張られる

+-------------+--------------+
| Class       | Shortcuts    |
+-------------+--------------+
| App\Article | $a, $a_, a() |
| App\Blog    | $b, $b_, b() |
| App\Comment | $c, $c_, c() |
| App\Like    | $l, $l_, l() |
| App\User    | $u, $u_, u() |
+-------------+--------------+

上記の図にある通り、Articleモデルに対しては $a のように、自動的にaliasを張ってくれます。
モデルの頭文字をとってaliasを張ってくれるようです。

実行結果はこんな感じ

>>> $u->first()
=> App\User {#3037
     id: 1,
     name: "hogehoge",
     email: "hogehoge@test.com",
     email_verified_at: null,
     created_at: "2019-06-06 23:38:47",
     updated_at: "2019-06-06 23:38:47",
     avatar: "default_avatar.png",
   }

起動したままセッションを更新できる

Tinx(もといTinker)を起動しているときにコードを変更しても、反映されず起動し直さないといけないです。
しかしTinxでは re() と更新コマンドを実行することでセッションを更新することができます。
reo() というコマンドを実行しておくと、コードの変更に伴って、自動的にセッション更新が行われるようです。

実行結果はこんな感じ

>>> re()
Reloading your tinker session...
Psy Shell v0.9.9 (PHP 7.2.17-1+ubuntu16.04.1+deb.sury.org+3 — cli) by Justin Hileman
+-------------+--------------+
| Class       | Shortcuts    |
+-------------+--------------+
| App\Article | $a, $a_, a() |
| App\Blog    | $b, $b_, b() |
| App\Comment | $c, $c_, c() |
| App\Like    | $l, $l_, l() |
| App\User    | $u, $u_, u() |
+-------------+--------------+

おわりに

Tinkerでも同じことができますが、その上で便利な機能が存在するTinxの紹介記事を書いてみました。
開発でのtry & errorのイテレーションが本当に速くなるので、必須ツールだと感じています。

私事ですが、テストを全然書いたことがなかったので、テストを書くときにめちゃくちゃ便利に感じました……。
web開発のいろはを脳に叩き込んでくれる人募集中です。