🙄

CakePHP4.4でErrorHandler (ConsoleErrorHandler)は非推奨

2022/12/14に公開

この記事はコネヒトアドベントカレンダー2022の14日目の記事です。

コネヒトでは現在社内の各プロジェクトのPHPのバージョンを上げることを目標の一つとして設定しています。
それに伴い主に使用しているPHPフレームワークのCakePHPも同時並行でバージョンを上げていってます。

今回はPHPではなく現時点でのCakePHPの最新バージョンの4.4で非推奨になったErrorHandler(ConsoleErrorHandler)、そしてExceptionTrapErrorTrapが登場した経緯を少し紹介したいと思います。

この変更が行われた理由は下記のissueで詳しく説明されていますが、ざっくりと言うと下記の様な動機があるらしいです(英語に自信がないので詳しくはissueのリンクを貼っておくので詳しく知りたい方はそちらからどうぞ!)

  • エラーハンドリングを担当するクラスと例外の描画を担当するクラスの責任が分散している
  • 致命的なエラーのハンドリングをデフォルトの例外ハンドリングに統合するべきと考えている
  • 致命的なエラーと致命的ではないエラーでは違う対応をしたい(ロギングや致命的ではないエラーなら無視したり)のでハンドリングの機構を別々にしたい

https://github.com/cakephp/cakephp/issues/16228

例えばどういったところが問題??

An example of this is that ErrorHandler::register() also binds a default
exception handler.

例としてErrorHandler::register()はデフォルトの例外ハンドラも一緒にバインドされると書いてありますが、全然知らなかったのでコードを見に行ってみたら

https://github.com/cakephp/cakephp/blob/359fb41445a63cdf877f6c34401d6dcdf9179c9b/src/Error/BaseErrorHandler.php#L67-L80

確かにそうでした。(ErrorHandlerはBaseErrorHandlerを継承しています)

解決策

そこで解決策として出てくるのが今回の4.4から出てきたErrorTrapExceptionTrapです

中身の処理をみたら以下のようになっていますね!

  • ErrorTrapClass
    • 致命的ではないエラーのハンドリングを登録(set_error_handrer()を実行)
    • 致命的なエラー(E_ERRORなど)は例外として投げ直す
  • ExceptionTrapClass
    • 致命的なエラーと例外のハンドリングを登録(set_exception_handler()register_shutdown_function()を実行)

具体的な使用方法は2022/12/14現在まだ日本語に翻訳されていないので英語版のドキュメントからどうぞ

https://book.cakephp.org/4/en/development/errors.html#changing-exception-handling

Discussion