Uncaught ReflectionException: Class log does not exist Laravel 5.2
Okay, after many hours of digging, the solution for my problem has been found. The reason why I say my problem is because the Exception
is very mis-leading.
Uncaught ReflectionException: Class log does not exist
This exception simply means Laravel tried to log an error but couldn't instantiate Laravel's Log
class. This is not due to the Log class going walk-abouts or hiding. This is because Laravel is still going through its boot process & has yet to load the Log
class.
So, this exception is thrown because an error occurred during the boot cycle of Laravel - when this error occurred it tried to throw an exception - but it can't throw an exception because the Log
class is yet the be loaded. Hence the reason we get a ReflectionException
This has occurred in all versions of Laravel the only reason we have seen the exception thrown in laravel 5.1 <= is because previously Laravel silently discarded the problem & carried on through its boot process - basically, your app would still break however you would not receive the Log class exception
.
In my particular case I didn't have the php-mysql
extension installed causing Laravel to break during its boot process.
Ultimately, it is incredibly difficult to debug what you may have done wrong due to the error been very mis-leading.
I hope this helps someone!
EDIT: On how to debug this error and find out WHICH missing extension/component is actually causing the problem take a look at @Ben Johnson's answer.
In your .env file make sure you have no spaces for values
for example this is allowed
DB_USERNAME=homestead
this is not allowed
DB_USERNAME=home stead
you can wrap the value in quotes if you have spaces.
DB_USERNAME="home stead"
really wish they used json for the .env file, maybe we should request that feature
The underlying error is revealed by modifying vendor/laravel/framework/src/Illuminate/Container/Container.php
and placing the following at the top:
<?php
namespace {
use Monolog\Logger as Monolog;
class log extends Illuminate\Log\Writer {
function __construct()
{
$this->monolog = new Monolog("local");
}
}
}
//Add curly-braces around the original content, like so:
namespace Illuminate\Container {
//All original code in this file goes here.
//...
}
(Credit to https://laracasts.com/discuss/channels/general-discussion/class-log-does-not-exist/replies/160902 for this idea.)
To add to the list of root-causes for this message, defining a closure in a configuration file and calling php artisan config:cache
subsequently will cause this (at least in Laravel 5.1). Solution for this manifestation: don't define closures in Laravel configuration files, per https://github.com/laravel/framework/issues/9625 .
Remove file bootstrap/cache/config.php
. This file may not be displayed on windows, if so, use double commander for example. Definitelly will work!
EDIT:
It may be caused by caching .env file, if it's your case, try to remove
bootstrap/cache/config.php