【Laravel】Tinkerで遊んでみる!

どーも!

たかぽんです!

今回はLaravelのTinker"ティンカー"について書いてみようと思います!

Tinkerを使えるだけでちょっとした確認等がとても早くなるので、是非これを機に扱いを覚えましょう!

Tinkerとは?

さて、普通にLaravelを触ってきただけではなかなか触れることがないこのTInker。

知ってるか知らないかで大きく開発効率が変わってきます...

TInkerとは、

Laravel Tinker is a powerful REPL for the Laravel framework, powered by the PsySH package

Artisan Console - laravel -

簡単に訳すと、PsySHパッケージによる、Laravel用のREPL(Read-Eval-Print Loop)です。

と。

REPLというのは、大雑把にいうと、一行コードを書いて、そのコードがすぐに評価(計算)され、結果が帰ってくる仕組みのことで、対話的にプログラムの実行ができます。

コマンドプロンプトやターミナルなんかがいい例ですね。

Takapon:MyProject taka$ echo hello
hello

少しだけ命令を書くとすぐに実行されて、結果がみえますよね。

(出力してなければ文字としては見えないけど...cpとか)

laravelでそういったちょっとしたメソッド等の動作確認を行えるのがTinkerです。

laravelをインストールしていればすでに使える状態にあるはずです。

Tinkerを使ってみる

さて、それではTinkerを使ってみます。

ターミナルでlaravelで作成したprojectへ移動し、以下のコマンドを入力します。

$ php artisan tinker

すると、以下のような画面になればOKです。

Takapon:MyProject taka$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.9 — cli) by Justin Hileman
>>>

もしもこの時点で上記のようにうまくいかないなら、以下のコマンドでTinkerをインストールし直すとうまくいくかもしれません。

composer require laravel/tinker
インストールできない!

tinkerのインストールができない場合は、laravel自体のversionが古く、composer.jsonに記載されているtinkerのversionとインストールしようとしているtinkerのversionが違う可能性があります。(筆者が試すとできなくて、それが原因っぽかったです)

で、じゃぁcomposer.jsonを直せばいけるかな?と思ったんですが、やっぱり新しいlaravelの環境周りも必要になりそうで、tinkerだけ新しくできず...

(tinkerではlaravelのコード片を使うので、同じくlaravel自体の最新の追加機能等が必要なのかも)

結局、laravel自体を最新の"^6.0"(2020/02時点)にあげて解決させました。

ただし、筆者のプロジェクトは特にしっかり作り込んでおらず、依存関係のあるコード(最新版になって使えなくなる機能)を含んでいないので、大丈夫なんですが...

ほとんど作り込んでないよ〜って方は以下を参考にlaravelのバージョンをあげてみてください。

上記で更新をすると、tinkerのバージョンが最新のものをインストールできます。(2020/02現在)

とりあえずechoしてみる

さて、それでは、一旦echoしてみましょうか。

tinkerの">>>"の後に以下を入力してみてください。

echo("hoge");

これは、laravelの.phpファイルに"echo("hoge");"を書いた場合に出力される内容が表示されています。

まぁ、当たり前ですね。

コレクションをみてみる

さて、それでは次はコレクションをみてみましょう。

>>> collect([1, 2, 3]);
=> Illuminate\Support\Collection {#2974
    all: [
        1,
        2,
        3,
    ],
}

Collectionだとこうなりますね。

配列をみてみる

次は配列です。

>>> array(1,2,3);
=> [
       1,
       2,
       3,
   ]

連想配列もみてみる

>>> array ('one' => '1', 'two' => '2', 'three' => '3');
=> [
       "one" => "1",
       "two" => "2",
       "three" => "3",
   ]

Carbonとかもみてみる

>>> Carbon\CarbonImmutable::now()
=> Carbon\CarbonImmutable @1581860001 {#3083
       date: 2020-02-16 13:33:21.921776 UTC (+00:00),
   }

今執筆してる時間がばれちゃいますねw

もう少し...

>>> Carbon\CarbonImmutable::now()->modify('+1 day');
=> Carbon\CarbonImmutable @1580688000 {#2978
       date: 2020-02-03 00:00:00.0 UTC (+00:00),
   }
>>> Carbon\CarbonImmutable::now()->addDay();
=> Carbon\CarbonImmutable @1580688000 {#2982
       date: 2020-02-03 00:00:00.0 UTC (+00:00),
   }

こんな風にしてみればCarbonのmodifyとaddDayは全く同じ出力を返すんだな、ってわかりますね。

変数として一時的にデータ保持もできる

以下、ちょっとわかりづらいですが、入力しているのは ">>>"の後だけです。

>>> $arr1 = ["hoge" => 1, "huga" => 2, "hugo" => 5];
=> [
       "hoge" => 1,
       "huga" => 2,
       "hugo" => 5,
   ]
>>> $arr2 = ["hage" => 3, "huge" => 4];
=> [
       "hage" => 3,
       "huge" => 4,
   ]
>>> array_merge($arr1, $arr2);
=> [
       "hoge" => 1,
       "huga" => 2,
       "hugo" => 5,
       "hage" => 3,
       "huge" => 4,
   ]

最初に$arr1に対して、hoge,huga,hugoを、そして$arr2に対してhage,hugeを入れています。

これをarray_mergeするとどうなるんだろう?と疑問に思ったら上記のようにしてみて試してみるんですね。

わざわざコードにddで書いてプログラムを実行して、ボタンをおしてログをみて〜といったことをする必要がないわけです。

自作のメソッドを呼び出してみる

さて、そしてtinkerではもちろん、自作のクラスのメソッドも呼び出してみることができます。

例えばですが...

hogeメソッドをTechController.phpに定義します。

(ちなみに、public staticメソッドでないと呼び出せません。)

<?php

namespace App\Http\Controllers;

class TechController extends Controller
{
    ...
    public static function hoge()
    {
        return "its called";
    }
}

では、Tinkerを再起動して、確認してみます。


>>> exit
Exit:  Goodbye
Takapon:MyProject taka$ php artisan tinker
Psy Shell v0.9.12 (PHP 7.3.9 — cli) by Justin Hileman
>>> App\Http\Controllers\TechController::hoge();
=> "its called"

tinkerを起動している状態で"exit"と打てば、元のコンソールに戻ることができます。

そして再度起動をすることで変更がtinkerでも反映されます。

そして、作成したメソッドは上記の通り、"名前空間\クラス名::メソッド名()"で呼び出すことができます。

undefined等になってしまう場合はtinkerの再起動を忘れているか、誤字の可能性が高いので、見直してみてください。

どんな時に使う?

さて、それではどんな時にTinkerを使うのかを最後にお話しします。

これは僕の場合ではあるんですが、コレクションを使っていて、あれ、このメソッドって配列で帰ってくるんだっけ?普通の値として帰ってくるんだっけ?コレクションを返すんだっけ?とわからなくなる場合などがあります。

そんな時は調べてもいいですが、さくっと手元で確認したりできますね。

あとは他人のコードをレビューしていて、このメソッド、こちらのメソッドと同じ出力で、可読性あがるので、それならこっちのがいいかも?とか、Tinkerの結果と一緒にレビューしてもいいと思います。

他にも他にも、先ほどのarray_mergeでもですが、キーが一緒で値が違うデータがをmergeしたらどうなるんだろう...?とかとか...

話始めるとキリがないのでこれくらいにしますが、そういった関数の挙動の確認等が主ですね。

まとめ

さて、今回はLaravelのTinkerを使ってみました。

とても基本的なところしかやっていないですが、とにかく便利です!

是非つかう習慣をつけましょう!

おすすめの記事