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