ホーム>Laravel>【Laravel】Handler::report(Exception $exception) must be compatible with report(Throwable $e) in Handler.php on line 37の解決方法
Laravel

【Laravel】Handler::report(Exception $exception) must be compatible with report(Throwable $e) in Handler.php on line 37の解決方法

いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。

Laravelの'Declaration of Handler::report() must be compatible with...'エラーの原因と解決方法、Laravel 11以降でのHandler.php廃止についてまとめました

エラー全文

PHP Fatal error: Declaration of App\Exceptions\Handler::report(Exception $exception) must be compatible with Illuminate\Foundation\Exceptions\Handler::report(Throwable $e) in /var/www/html/app/Exceptions/Handler.php on line 37

原因

これはPHPの「子クラスのメソッドが親クラスのメソッドと引数の型が一致していない」ときに出るエラーです(must be compatible with = 「〜と互換性がありません」)。

app/Exceptions/Handler.php は Laravel 標準の Illuminate\Foundation\Exceptions\Handler クラスを継承していますが、Laravel 7 で親クラス側の report() の引数が Exception から Throwable に変更されました。

そのため、Laravel 6以前からアップグレードしたプロジェクトで Handler.php が古い書き方(Exception $exception)のまま残っていると、親クラスの型と一致せずこのエラーが出ます。

PHP 7でThrowableExceptionError共通の親インターフェースとして導入されたことで、LaravelもExceptionだけでなくErrorもまとめて扱えるようにThrowableへ移行した、という経緯です。

解決方法

ExceptionThrowable に変更すれば解決します。

use Throwable; // Throwable を明示的に use する

// 旧バージョンの書き方(Laravel 6以前)
public function report(Exception $exception)
{
    parent::report($exception);
}

// 修正後(Laravel 7以降)
public function report(Throwable $exception)
{
    parent::report($exception);
}

render()やrenderForConsole()でも同様のエラーが起きることがある

同じ「must be compatible with」エラーは、report() 以外のメソッドをオーバーライドしているときにも発生します。エラーメッセージに出てくるメソッド名を確認し、親クラス(Illuminate\Foundation\Exceptions\Handler)側の最新の引数・戻り値の型に合わせてください。

// render() も Throwable に対応させる
public function render($request, Throwable $exception)
{
    return parent::render($request, $exception);
}

使っているLaravelのバージョンによって親クラスのメソッドの型(引数だけでなく戻り値の型指定の有無なども)が異なることがあるので、エラーが消えない場合はvendorディレクトリ内の実際のシグネチャを確認するのが確実です。

cat vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php

Laravel 11以降の場合:Handler.php自体が廃止されています

Laravel 11で例外処理の仕組みが大きく変わり、新規プロジェクトには最初から app/Exceptions/Handler.php が存在しません。代わりに bootstrap/app.phpwithExceptions() で例外処理を設定する方式になりました。

// bootstrap/app.php (Laravel 11以降)
->withExceptions(function (Exceptions $exceptions) {
    $exceptions->report(function (Throwable $e) {
        // カスタムのreport処理
    });
})

この記事のエラーが出るのは、Laravel 6以前で作られたプロジェクトを新しいバージョンにアップグレードし、Handler.php が古い書き方のまま残っている場合がほとんどです。Laravel 10以前のプロジェクトなら本記事の修正方法(ExceptionThrowable)で解決しますが、Laravel 11以降で新規に作ったプロジェクトの場合はそもそもHandler.phpが存在しないため、bootstrap/app.php側の書き方を確認してください。

それでも解決しない場合:AIチャットに質問する際に添付すると良い情報

コマンドを実行できないAIチャット(ChatGPT・Claude chatなど)に質問する場合、以下の情報を貼り付けて質問すると、的確な回答が得やすくなります。

  • エラーメッセージ全文(ファイル名・行番号を含めて省略せずに)
  • php artisan --version の出力(Laravelのバージョン)
  • app/Exceptions/Handler.php の該当メソッド部分のコード(存在する場合)
  • bootstrap/app.phpwithExceptions() 部分のコード(Laravel 11以降の場合)
  • どのバージョンからアップグレードしたか(古いプロジェクトを引き継いだ場合は分かる範囲で)

特に「Laravelのバージョン」と「Handler.phpの該当コード」の2つは、この手のエラーの原因切り分けにほぼ必須です。

まとめ

このエラーは、Handler.php 内のメソッドの引数の型が、Laravel本体側の親クラスの型と一致していないために起きるPHPの型エラーです。ExceptionThrowable に変更すれば解決するケースがほとんどですが、Laravel 11以降で作られたプロジェクトにはそもそも Handler.php が存在しないため、その場合は bootstrap/app.phpwithExceptions() を確認してください。

フィードバックのお願い
この記事のフィードバックがありましたらYoutubeの適当な動画にコメントしていただいたり、お問い合わせからご連絡ください。