この記事は ミライトデザイン Advent Calendar 2021 18日目の記事です。
【超入門】Laravelのデバッグ手法22選の記事でも紹介しています。
Laravel Ray とは
有償のデバッグデスクトップアプリです。
おしゃれなUIが特徴です。
Ray自体はLaravel専用というわけではなく他のPHPフレームワークや、JavaScript、NodeJS、Bash、Ruby、Go等の他の言語にも対応しています。
Laravelに導入する場合ですが、PHP拡張機能を別途インストールすることなく spatie/laravel-ray のComposerライブラリをインストールするだけでokです。
ブレークポイントが張れるのと、デスクトップ通知ができるのが便利そうだなと感じました。
機能としては beyondcode/laravel-dump-server の代替ツールと言って良さそうです。
インストール
$ composer require spatie/laravel-ray --dev
設定ファイルの作成
$ php artisan ray:publish-config
Docker
や Homestead
環境を利用する場合は下記のオプションを付けて実行してください。
$ php artisan ray:publish-config --docker
# or
$ php artisan ray:publish-config --homestead
Laravelプロジェクトルートに ray.php
が生成されます。
config/ray.php
へ移動します。
$ mv ray.php config/
Ray on Docker
-
Docker
20.03 以降
docker-compose.yml
で環境変数で渡してあげると良さそうです。
- environment
-
RAY_REMOTE_PATH
にコンテナ側から見たLaravelプロジェクトルートディレクトリを指定する。 -
RAY_LOCAL_PATH
にホスト側から見たLaravelプロジェクトルートディレクトリを指定する。
-
- extra_hosts
- コンテナからホスト上のRayサービスに接続したいのでホスト設定をします。
services:
app:
image: php-fpm
# ...
environment:
- RAY_REMOTE_PATH=/work/backend
- RAY_LOCAL_PATH=$PWD/backend
extra_hosts:
- "host.docker.internal:host-gateway"
web:
image: nginx
# ...
使い方
使い方は公式ドキュメントに載ってるので詳しくはこちらを参照ください。
https://spatie.be/docs/ray/v1/usage/reference
https://spatie.be/docs/ray/v1/usage/framework-agnostic-php-project
いくつか便利なメソッドを抜粋します。
基本
ray($variable);
ray($variable, $another, ...);
文字列や配列、オブジェクトを表示します。
ray('a string');
ray(['an array']);
ray(app());
-
ファイル名:行番号
のリンクからエディタへジャンプできます。 -
Command
+K
スクリーンをクリアできます。 -
Command
+L
アプリを非表示にできます。
色付け
rayに送信したデバッグコードに色付けできます。
ray('this is green')->green();
ray('this is orange')->orange();
ray('this is red')->red();
ray('this is blue')->blue();
ray('this is purple')->purple();
ray('this is gray')->gray();
上部バーの色のチェックボックスからフィルタリングできます。
dump & die
rayに送信後、処理を終了します。
ray($variable)->die();
// or
rd($variable);
現在の画面をクリア
rayの画面をクリアできます。
ray('🍎');
ray()->newScreen();
ray('🍌');
or
ray('🍎');
ray()->newScreen('🍌');
すべての画面をクリア
上部メニューの左、右ボタンから前後の画面の履歴を遡れますが、すべてクリアしたい場合は下記のコードを実行します。
ray()->clearAll();
呼び出し元の関数を表示
呼び出し元の関数を表示します。バックトレースの1つ目だけ表示してくれます。
ray()->caller();
バックトレース
ray()->backtrace();
// or
ray()->trace();
ブレークポイント
$books = Book::all();
foreach ($books as $book) {
ray($book->name);
ray()->pause();
}
ブレークポイントを張ることができます。
XDebugと比較してしまうとやれることは少ないですが便利そうです。
カウント
何回を通ったかカウントします。
$books = Book::all();
foreach ($books as $book) {
ray()->count();
}
foreach (range(1, 4) as $i) {
ray()->count('first');
foreach (range(1, 2) as $j) {
ray()->count('first');
ray()->count('second');
}
}
カウンターに名前を付けて同じカウンターが何度呼ばれたかカウントしてくれます。
クラス名
$books = Book::all();
ray()->className($books);
パフォーマンスとメモリ使用量の測定
ランタイムとメモリ使用量を表示できます。
複数回 measure 関数が呼ばれるとその間のラップタイムを表示されます。
また、実行時に使用された最大メモリ数を表示します。
ray()->measure();
sleep(1);
ray()->measure();
sleep(2);
ray()->measure();
ray()->measure(function() {
sleep(5);
});
デスクトップ通知
デスクトップ通知を表示できます。
ray()->notify('The run command has finished');
長いコマンドを実行して終わった時にデスクトップ通知させておくと良いかもしれないと思いました。
個人的に一番感動しました!
phpinfo を表示
phpinfo を表示できます。
ray()->phpinfo();
ray()->phpinfo('xdebug.enabled', 'default_mimetype');
アプリの表示と非表示
ray()->hideApp();
sleep(5);
ray()->showApp();