Lighthouseを使うとTelescopeに例外が記録されなくなって不便
ワークアラウンド
laravel-graphql-playgroundをつかえばTraceがみられる
このTraceはlighthouseが依存しているwebonyx/graphql-phpが作成している
問題
LighthouseをつかうとLaravel TelescopeのExceptionに例外が記録されない
App\Exceptions\Handlerでエラーがハンドリングされなくなるっぽい
lighthouseのエラーハンドリング
エラーハンドラを指定できる
TelescopeのHandlerをつかえるようにするためにはlighthouseではcustom handlerを設定すればいいようだ
https://github.com/nuwave/lighthouse/blob/c5e48f67558cc24049cd11e2a2b8e6fcd3b00fa8/src/lighthouse.php#L164-L166
path:このファイルはインストール後にはconfig/lighthouse.phpに配置される
ここにApp/Exceptions/Handlerを登録すれば良い…と思うが、Lighthouseに登録するError Handlerには条件がある
The classes must implement \Nuwave\Lighthouse\Execution\ErrorHandler
とあるのでstaticメソッドを実装する必要が出てくる
https://laravel.com/docs/6.x/errors#renderable-exceptions
https://github.com/laravel/framework/blob/cc3167d002a8c6f87e8f7e484205f90cc9d2611c/src/Illuminate/Foundation/Exceptions/Handler.php#L116-L123
でlogger(実態はIlluminate\Log\LogManager)にわたすオブジェクト ['exception' => $e]は、lighthouseを使っているとGraphQL\Error\Errorが渡される
そこに渡した例外オブジェクトがTelescopeのTypeに相当する
https://gyazo.com/a91e5c64ee6bbdf10718b0bf4683c671
これは、Laravelのアプリケーション側のHandler(app/Exceptions/Handler.php )のここから呼ばれている
Loggerでログが書き込まれると、LaravelのEventのしくみによって、TelescopeのExceptionWatcherが呼び出され、記録される
$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のエラーオブジェクトのはもとのオブジェクトに変換して記録する
// see https://github.com/webonyx/graphql-php/blob/e7bef7c3be56ef35cea6c2f10006e0d596c06cc8/src/Error/Error.php#L27-L28
// https://github.com/webonyx/graphql-php/blob/8c8abac5112a3c2dd9f096c724ddfa0385c9697f/tests/Error/ErrorTest.php#L20-L25
if ($exception instanceof GraphQL\Error\Error) {
parent::report($exception->getPrevious());
}
// 以下はそのまま
parent::report($exception);
}
getTrace()を出力できるようにする←これがわからなくてとまっている