Why does not stack trance display a complied file but original file?
Laravel 8.83.5またはLaravel 9へアップグレードすると、エラー発生時のStack Traceの表示がstorage/framework/views内のコンパイルされたファイルになってしまいます。
例えばですが、0a1b72e021d542c2af325a856fadd63c83a4757b.phpといったコンパイル済み
のphpが表示されるんです。
私の開発環境はWindows OSのローカルPCなのですが、Laravel 8の最新バージョン(少なくとも8.83.5)やLaravel 9で発生します。
問題発生前のバージョンはLaravel 8.61.0)
問題発生時のバージョンはLaravel 8.83.5 またはLaravel 9
原因や解決策はわからないですが、回避策を見つけたので共有します。
Larave 8.61とLaravel 8.83.5/Laravel 9でのStack traceの違い
Laravel 8.61のStack trace(望ましい表示)
この例では、resources/views/livewire/recordsにある、records-list.blade.phpというファイルの5行目がエラーになっていることが分かります。
つまり、オリジナルのファイル上のどこでエラーが発生したかわかるようになっています。
Laravel 8.83.5のStack trace(望ましくない表示)
ところが、Laravel 8.83.5の表示は下記になります。
オリジナルのファイルではなく、コンパイルされたeacd1ed14f76c4590599cc7aec3ffba06289dca4.phpというファイルのどこでエラーが発生したかを表示しています。
Larave 9でも同じです。
これでは、具体的にどのファイルでエラーが発生しているか分からず、デバッグの効率が下がってしまいます。
原因と解決策はわかっていません。
私の開発環境だと思います。メインでの開発環境として、Windows 10のPC上にcomposer, node.js, XAMPP, MySQLをインストールした環境を使っています。
回避策
結論: Laravel 9にアップグレードしてDockerを使う。
開発環境として使っているWindows PC上に、WSL2でDocker環境を構築するとうまく表示されました。
この時、Laravel 9にアップグレードしました。Laravel 8.83.5ではDocker上でも同じ問題が発生しました。
Laravelのバージョンを9.5.1にして、同じソースを使ってそれぞれの環境での表示結果を比較します。
ローカル環境 (XAMPPを使用)での表示
※phpのバージョンを8.0.17にしても同じ問題が発生ました。
Dockerの環境 (WSL 2を使用)での表示
問題なくオリジナルファイルが表示される。
※Docker環境では、オリジナルのファイルが使用されています。
結論
原因と対策方法が明らかになるまでは、コンパイルされたファイルで何とかデバッグする。
どうしてもエラーの原因が分からない場合は、Docker環境に切り替えてデバッグする。
以上です。