オブジェクト指向とかデザインパターンとか開発プロセスとかツールとか

satoshi's ソフトウェア開発

js






当サイトはアフィリエイト広告を利用してます。

Laravel

PHP Fatal error: Uncaught ReflectionException: Class "env" does not exist in /var/www/hoge/vendor/laravel/framework/src/Illuminate/Container/Container.php:877 の解決方法

投稿日:


既存のLaravelのサイトで、今まで動いてたのにいきなりエラー画面になってました。

なぜっっっ!

storage/log/laravel.log を確認すると、

PHP Fatal error:  Uncaught ReflectionException: Class "env" does not exist in /var/www/hoge/vendor/laravel/framework/src/Illuminate/Container/Container.php:877

みたいなエラーが出てます。

ぐぐってみたら、composer update すれば解決するとか、composer dump-autoload -o すればいいとか、いろいろあったけどどれも解決できず。

いろいろと試行錯誤してはぐぐったりして解決方法を探ってると、例外が出ているところで dd($exception) すれば原因が取れそうだという情報を発見。

これまでの記録をしてないので、どうやって行き当たったのか記憶がないんだけど、コンソールのログを逆スクロールして見返してみると、app/Exceptions/Handler.php を変更していました。
たぶんここです。

    public function report(Throwable $exception)
    {
        dd($exception);
        parent::report($exception);
    }

これを追加してcomposerを実行したところ、

$ composer dump-autoload -o
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
^ ReflectionException {#54
  #message: "Class "env" does not exist"
  #code: -1
  #file: "./vendor/laravel/framework/src/Illuminate/Container/Container.php"
  #line: 877
  trace: {
    ./vendor/laravel/framework/src/Illuminate/Container/Container.php:877 { …}
    ./vendor/laravel/framework/src/Illuminate/Container/Container.php:758 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/Application.php:841 { …}
    ./vendor/laravel/framework/src/Illuminate/Container/Container.php:694 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/Application.php:826 { …}
    ./vendor/laravel/framework/src/Illuminate/Container/Container.php:1425 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/Application.php:631 { …}
    ./vendor/laravel/framework/src/Illuminate/Log/LogManager.php:523 { …}
    ./vendor/laravel/framework/src/Illuminate/Log/LogManager.php:109 { …}
    ./vendor/laravel/framework/src/Illuminate/Log/LogManager.php:581 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php:252 { …}
    ./app/Exceptions/Handler.php:40 {
      App\Exceptions\Handler->report(Throwable $exception)^
      › {
      ›     parent::report($exception);
      › }
    }
    ./vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:366 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:131 { …}
    ./artisan:37 { …}
  }
}

新しい情報が見つかりました。

  #file: "./vendor/laravel/framework/src/Illuminate/Container/Container.php"
  #line: 877

./vendor/laravel/framework/src/Illuminate/Container/Container.php にもコードを追加してみましょう。

        try {
            $reflector = new ReflectionClass($concrete);
        } catch (ReflectionException $e) {
            debug_print_backtrace(10);
            dd($e);
            throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
        }

composerを実行してみます。

$ composer dump-autoload -o
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover

In cache.php line 91:

  Call to undefined function str_slug()


Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1

キター!!!!

str_slug() 関数を使ってるところを grep で探します。

config/cache.php と config/session.php で使ってました。

    str_slug()

use Illuminate\Support\Str;

(略)
    Str:slug(hoge)

に変更したら正常に動くようになりました。







-Laravel
-, ,

Copyright© satoshi's ソフトウェア開発 , 2024 All Rights Reserved Powered by STINGER.