既存の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)
に変更したら正常に動くようになりました。