ありそうとかいう曖昧な表記で責任を回避する
環境
laravel/framework 9.47.0
PHP 8.1.12
症状
前提として、レンダしたい blade のキャッシュが存在しないためにコンパイルする際に発生します。
例えば、@if (auth()->user()->isSystemAdmin()) みたいな if ディレクティブを書いた時、
字句解析が if (auth() までを対象としてしまい、
Illuminate\View\Compilers\BladeCompiler の hasEvenNumberOfParentheses() の以下の行でエラーを吐く。
$tokens = token_get_all('<?php '.$expression);
おそらくすべてのディレクティブの条件式に () を含むものを指定すると発生し、
例外処理が上手く行ってないのかは不明ですが、laravel 側で捕捉できず結果的に 502 エラーが出ます。
原因
@ から始まる語句の解析に Illuminate\View\Compilers\BladeCompiler の
compileStatements() を利用していたようで、
9.46.0 以前と 9.47.0 以降とで大きく内容が異なっています。
9.46.0 まで
return preg_replace_callback( '/\B@(@?\w+(?:::\w+)?)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x', function ($match) { return $this->compileStatement($match); }, $value );
9.47.0 から
preg_match_all('/\B@(@?\w+(?:::\w+)?)([ \t]*)(\( ( [\S\s]*? ) \))?/x', $template, $matches);
暫定の対策
laravel/framework を 1 つ前のバージョンである 9.46.0 にしてやりすごすしかない気がします。
"laravel/framework": "9.46.0",