🦔

Laravel 8.65/8.66~ 今後は、deprecated エラーでガツンと処理が止まる事はなくなる

2021/10/24に公開

まえがき

ここ最近、私も PHP7.3 → 7.4 の移行とかやっていますが、地味に小面倒だったりするのが、deprecated な書き方でエラーとなって、ガツンと処理が止まってしまう事なんですね。

Laravelチームもこの件に限らないと思いますが、PHP8.1対応で、結構奮闘したようです。

本題

という事で、タイトルにもある通り、今後は deprecated なエラーは、ある意味スルーされます。エラーでガツンと止まる事はありません。

ただ、deprecated が発生していることを把握できないのは困ってしまいますので、そこで以下のようにログ設定を変更すれば、deprecated な際に、ログられる事になります。

まず、以下のような記述が加わっているのをチラと確認します。

.env

LOG_DEPRECATIONS_CHANNEL=null

config/logging.php

'deprecations' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),

そして、後は例えば .envで以下のように変えてやります。
.env

LOG_DEPRECATIONS_CHANNEL=stack

これで、deprecated な際に stack チャンネル経由でログられます。

ユーザーが trigger させた deprecated エラーも対象になるので、サクッと以下のように書いて確認できます。

Route::get('/', function () {

    trigger_error("deprecated ですよ", E_USER_DEPRECATED);

    return view('welcome');
});

テストの際は?

テストの際も上記を踏襲しますが、ただテストの際は、ガツンとエラーにさせる事ができます。それが、以下のやつです。

    public function test_example()
    {
        $this->withoutDeprecationHandling(); // これ

        $response = $this->get('/');

        $response->assertStatus(200);
    }

withoutDeprecationHandling() を付けてやれば、今までのようにガツンとエラー表示させることができます。ログなど見てられないという私みたいな怠け者には、これは便利です。

参考

GitHub: Logs deprecations instead of treating them as exceptions #39219
GitHub: Adds withoutDeprecationHandling #39261
GitHub: [8.x] Logs deprecations instead of treating them as exceptions #5711

間違い等ありましたらコメントお願いします。

Discussion