Lighthouseを使うとTelescopeに例外が記録されなくなって不便
ワークアラウンド
問題
App\Exceptions\Handlerでエラーがハンドリングされなくなるっぽい
lighthouseのエラーハンドリング
TelescopeのHandlerをつかえるようにするためにはlighthouseではcustom handlerを設定すればいいようだ
path:このファイルはインストール後にはconfig/lighthouse.phpに配置される
ここにApp/Exceptions/Handlerを登録すれば良い…と思うが、Lighthouseに登録するError Handlerには条件がある
The classes must implement \Nuwave\Lighthouse\Execution\ErrorHandler
とあるのでstaticメソッドを実装する必要が出てくる
でlogger(実態はIlluminate\Log\LogManager)にわたすオブジェクト ['exception' => $e]は、lighthouseを使っているとGraphQL\Error\Errorが渡される
そこに渡した例外オブジェクトがTelescopeのTypeに相当する
https://gyazo.com/a91e5c64ee6bbdf10718b0bf4683c671
これは、Laravelのアプリケーション側のHandler(app/Exceptions/Handler.php )のここから呼ばれている $exception->getTrace()に失敗しているのでかきこめていない
渡されてくるオブジェクト(とgetPrevious())は、getTraceAsString()では取得できるが、getTrace()が出ない。これが記録されない原因
なぜ……?
config/lighthouse.phpのerror_handlerをApp/Exception/Handlerにする(複数指定できるので、追加する?)
App/Exception/Handler.phpで\Nuwave\Lighthouse\Execution\ErrorHandlerを実装する
記録側では、Lighthouseのオブジェクトが渡したときだけもとの例外オブジェクトを参照するようにする
code:App/Exception/Handler.php
public function report(Exception $exception)
{
// GraphQLのエラーオブジェクトのはもとのオブジェクトに変換して記録する
if ($exception instanceof GraphQL\Error\Error) {
parent::report($exception->getPrevious());
}
// 以下はそのまま
parent::report($exception);
}
getTrace()を出力できるようにする←これがわからなくてとまっている