どーも!
たかぽんです!
今回は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を使ってみました。
とても基本的なところしかやっていないですが、とにかく便利です!
是非つかう習慣をつけましょう!