未捕获的反射异常:类log不存在 Laravel 5.2。

59

我正在尝试从GitHub克隆我的一个现有项目。在克隆后,我运行composer install。在此过程中,我收到以下错误:

Uncaught ReflectionException: Class log does not exist

我正在Centos 7上运行Laravel 5.2。

我已经看到了以下解决方法:

  • 删除.env文件中的空格。
  • 删除vendor目录并重新安装。
  • 删除composer.json中要求的某些软件包。

我已经:

  • example.env替换了我的.env以避免任何自定义配置错误。
  • 我已经删除并重新克隆了仓库。
  • 我已经使用Laravel附带的默认composer.json,以查看是否有所不同。

以上方法均未成功。我还在另一台机器上设置了相同的环境,并且应用程序可以正常工作。唯一的区别是(可工作的)机器不是从Git中克隆出来的—它是初始构建环境。

我收到的堆栈跟踪:

PHP Fatal error:  Uncaught ReflectionException: Class log does not exist in /var/www/html/Acme/vendor/laravel/framework/src/Illuminate/Container/Container.php:736
    Stack trace:
    #0 /var/www/html/Acme/vendor/laravel/framework/src/Illuminate/Container/Container.php(736): ReflectionClass->__construct('log')
    #1 /var/www/html/Acme/vendor/laravel/framework/src/Illuminate/Container/Container.php(631): Illuminate\Container\Container->build('log', Array)
    #2 /var/www/html/Acme/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(674): Illuminate\Container\Container->make('log', Array)
    #3 /var/www/html/Acme/vendor/laravel/framework/src/Illuminate/Container/Container.php(845): Illuminate\Foundation\Application->make('log')
    #4 /var/www/html/Acme/vendor/laravel/framework/src/Illuminate/Container/Container.php(800): Illuminate\Container\Container->resolveClass(Object(ReflectionParameter))
    #5 /var/www/html/Acme/vendor/laravel/framework/src/Illuminate/Container/Container.php(769): Illuminate\Container\Container->getDependenc in /var/www/html/Acme/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 736

非常感谢您提供的任何帮助。提前致谢。


我也会关注这个答案,因为我遇到了类似的问题。我使用的是laravel 5.1.28版本,最近第一次进行了composer update,自那以后,在heroku上进行生产构建时就出现了该错误。我已经回滚了我所做的composer.json更改,但是像预期的那样没有任何变化;这与所有被拉入vendor的更新有关。 - Diane Kaplan
@DianeKaplan 我已经为您发布了一个答案,请您过目。它帮助我找到了我的错误... - jakehallas
谢谢,@jakehallas!我正在使用Postgres-您是否知道是否需要类似的扩展名,还是它足够特定,以至于我的问题可能是其他原因?我是一个完全的新手,所以像这样的问题远离了我的舒适区 :/ - Diane Kaplan
并重新启动您的HTTP服务器。 - Handsome Nerd
对我来说,通常发生这种情况是因为我忘记在需要包含所需文件的文件顶部添加“Use Log;”,并在内部方法中使用它们。 - cosmoloc
显示剩余2条评论
28个回答

66

好的,在经过多个小时的挖掘后,我找到了解决我的问题的方法。我之所以说是我的问题,是因为这个Exception非常具有误导性。

Uncaught ReflectionException: Class log does not exist

这个异常只是意味着 Laravel 尝试记录错误,但无法实例化 Laravel 的 Log 类。这不是因为 Log 类走失或隐藏了。而是因为 Laravel 仍在进行启动过程,还没有加载 Log 类。

因此,当 Laravel 启动周期中发生错误时,会抛出该异常,但它无法抛出异常,因为尚未加载 Log 类。因此我们得到了一个 ReflectionException

这种情况在所有版本的 Laravel 中都会发生,唯一的原因是我们看到在 laravel 5.1 <= 中引发异常是因为 Laravel 以前会静默地丢弃问题并继续通过其启动过程-基本上,您的应用程序仍然会崩溃,但您不会收到 Log class exception

在我特定的案例中,我没有安装 php-mysql 扩展,导致 Laravel 在启动过程中中断。

最终,由于错误信息非常具有误导性,因此极难调试您可能犯的错误。

希望这可以帮助某些人!

编辑:如何调试此错误并找出实际引起问题的缺失扩展/组件,请查看 @Ben Johnson 的答案。


1
是的,这是Laravel的静默行为...我遇到了这个问题,在我的情况下,我不得不安装php-mbstring和php-xml扩展。所以基本上,如果我看到这个错误,我会检查并安装所需的扩展,这些扩展在这里列出:https://laravel.com/docs/5.2(服务器要求),或者如果它们被包需要,也可以安装其他扩展。 - Dmitriy Lezhnev
你是如何实际解决这个问题的? - fabian
3
我安装了缺失的 PHP 包 php-mysql - jakehallas
@jakehallas,能否请您提及缺失的PHP包php-mysql以及参考链接或说明? - Kumar Shanmugam
我也遇到了同样的问题,但是我的情况是在将一个类移动到另一个文件夹时忘记更新命名空间。 - Aion
显示剩余4条评论

36
基本错误通过修改 vendor/laravel/framework/src/Illuminate/Container/Container.php 文件并在顶部放置以下内容来显示:
<?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.

    //...
}

(感谢https://laracasts.com/discuss/channels/general-discussion/class-log-does-not-exist/replies/160902提供的思路。)
为了补充这个信息,定义一个闭包在配置文件中,并随后调用 php artisan config:cache 将会导致这个错误(至少在 Laravel 5.1 中如此)。此表现的解决方案是:不要在 Laravel 配置文件中定义闭包,参见:https://github.com/laravel/framework/issues/9625

2
这个问题的根源是我试图在一个配置文件(config/)中使用一个Facade方法,导致了真正的异常被抛出。 - oyelaking
这有所帮助,但并没有完全解决问题。我还遇到了一个错误,即缺少配置类,通过在日志类之后添加此类进行了修复:内联 `class config extends \Illuminate\Log\Writer { function __construct() { $this->monolog = new Monolog("local"); } public function get($test, $test2) { return $test; } }}` - Jadro007
增加以下代码行来实际写日志,以便找出原因: $this->monolog->pushHandler(new \Monolog\Handler\StreamHandler('/tmp/log.txt')); - Alex
“PHPExcel_Shared_Font”在app/config.php中未找到是我的真正错误,我不得不删除该文件并更新composer。这段代码显示了真正的错误。谢谢。 - Bantu
太棒了!这个解决方法真的救了我的一天 :) 原来有人决定忽略composer.lock,所以本地开发和我们的构建服务器不同步,导致包没有被安装。 - nover

36

在您的.env文件中,请确保值之间没有空格。

例如,以下是允许的

DB_USERNAME=homestead

这是不被允许的

DB_USERNAME=home stead

如果你的值包含空格,你可以用引号将其括起来。

DB_USERNAME="home stead"

我真希望他们在.env文件中使用JSON格式,也许我们应该请求这个功能。


2
感谢您的回答。空格可能不会对问题提问者造成问题,但它确实引起了我的问题。这个答案让我避免了一个看起来很漫长的鹅追逐。 - Chris Schmitz

15

删除文件 bootstrap/cache/config.php。如果在Windows上无法显示该文件,则可以使用Double Commander等软件。肯定能行!

编辑:

这可能是由于缓存 .env 文件引起的,如果是这种情况,请尝试删除 bootstrap/cache/config.php


5

我发现在向我的.env文件添加几行后出现了同样的行为。如果不带引号,空格是不被允许的,可以通过以下方式解决:

APP_YOUR_NAME="一些带有空格的值"


3
当Composer更新时,我认为Laravel进行了一些验证。
  • 如果未安装,请安装“unzip”包(“sudo apt install unzip”)。
  • 检查所有必需的扩展程序,如“mysql”,“json”,“curl”,“xml”,“zip”等,并安装(“sudo apt install php7.1-mysql”),如果未安装。
  • 检查您的文件/文件夹权限。
  • 检查您的“.env”文件。
  • 检查您的“config”文件。
  • 再次运行“composer update”。
安装解压软件对我有用。祝好运 :)

1
apt 不是 Centos 的一部分,您需要添加相关的软件源并使用 yum 来代替。 - moopet
是的,我的错误,@moopet 是正确的。我的解释适用于 Ubuntu。对于像 CentOS 这样的其他发行版,您应该使用这样的命令:"yum install php-mysql"。 - boreasenes

3

EDIT::

由于我对调试和重新配置路径等以使VM运行顺畅的方法不够满意,我反思了这个过程并重新安装了vagrant box laravel/homestead (virtualbox 1.0.1)。

对我来说,问题可能源自config/app.php中缺少逗号。缺少逗号可能会停止编译过程并输出Uncaught ReflectionException: Class log does not exist错误。


这不是一个直接的答案,但更多地是为那些冒险进入这个沉默错误深渊的人提供指南。

系统:macOS Sierra

Vagrant:1.9.1(撰写时的最新版本)

VM:laravel/homestead (virtualbox 0.4.0)

Laravel 版本:5.1.*

PHP:7.0.*


尝试解决该问题的重复尝试包括:

  1. 重写、删除 .env 文件以解决潜在的解析问题
  2. php7.1 和 mcrypt / mbstring 问题
  3. 安装 composer 建议的软件包
  4. 更新 homestead.rb
  5. 路径相关的问题

关键是(对我来说),这似乎是初始设置中的virtualbox版本:

vagrant box add laravel/homestead

而应该尝试提供版本号,如下所示:

vagrant box add laravel/homestead --box-version 0.4.0


杂项

我尝试并失败了以下laravel/homestead virtualbox 版本:

  • 1.0.1(默认)

laravel/homestead-7

  • 0.2.1

3
在我的情况下,缺少PDO扩展是问题所在。安装了它之后,问题得到解决。

3
此问题是由于conf/目录中某文件或.env文件中出现语法错误引起的。在我的情况下,当我向conf/app.php文件的提供者和别名数组providers和aliases添加服务提供程序和Facade时,我忘记在行末加上::class,因此出现了这个错误。我纠正了这个错误后,错误消失了。

2

这个错误可能是由一个配置文件中的错误引起的。 为了找到是哪个文件引起的错误,请将 /vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php 中的函数 loadConfigurationFiles 更改为:

protected function loadConfigurationFiles(Application $app, RepositoryContract $repository)
{
    foreach ($this->getConfigurationFiles($app) as $key => $path) {
        var_dump('loading key: ' . $key . ' -- path: ' . $path);
        $repository->set($key, require $path);
    }
}

运行php artisan时,最后加载的“key”是导致错误的配置文件。纠正它,并不要忘记删除您的var_dump命令...祝你好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接