未捕获的 ReflectionException:类日志不存在 Laravel 5.2

Posted

技术标签:

【中文标题】未捕获的 ReflectionException:类日志不存在 Laravel 5.2【英文标题】:Uncaught ReflectionException: Class log does not exist Laravel 5.2 【发布时间】:2016-04-30 22:47:11 【问题描述】:

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

Uncaught ReflectionException: Class log does not exist

我在 Centos 7 上运行 Laravel 5.2。

我看过以下参考:

删除.env 文件中的空格。 删除供应商目录并重新安装 删除 composer.json 中所需的某些包

我有:

将我的.env 替换为example.env 以避免任何自定义配置错误。 我已删除并重新克隆了 repo。 我使用了 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 上,最近在一段时间内第一次做了作曲家更新,从那以后我在 heroku 上构建到生产时遇到了这个错误。我已经回滚了我所做的 composer.json 更改,但怀疑没有更改;这与拉入供应商的所有更新有关:( @DianeKaplan 我已经为您发布了一个答案,让您大开眼界。它帮助我找到了我的错误... 谢谢,@jakehallas!我正在使用 postgres-您是否碰巧知道我是否需要类似的扩展,或者它是否足够具体以至于我的问题可能是其他问题?我是个新手,所以像这样的问题超出了我的舒适区:/ 然后重启你的 http 服务器。 对我来说,这通常发生在我忘记添加“使用日志;”时在包含所需文件的文件顶部..并在内部方法中使用。 【参考方案1】:

即使这是一个旧线程,希望我的回答有一天可以帮助某人(比如我)。 就我而言,我发现我应该像这样从终端运行工匠:

sudo php artisan command

这是因为它没有写入日志文件的权限。

【讨论】:

【参考方案2】:

正如之前的答案所述,我们在 laravel 中的一个配置文件存在问题。我们使用了在 laravel 5.2+ 中不再可用的全局 $app 变量。

我们发现这个的方法是在 src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php 的 loadConfigurationFiles 方法中检查哪个文件加载失败。

【讨论】:

【参考方案3】:

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

Uncaught ReflectionException: Class log does not exist

这个异常仅仅意味着 Laravel 试图记录一个错误但无法实例化 Laravel 的 Log 类。这不是因为 Log 类四处走动或隐藏。这是因为 Laravel 仍在经历它的启动过程并且还没有加载 Log 类。

所以,这个异常被抛出是因为在 Laravel 的启动周期中发生了一个错误——当这个错误发生时它试图抛出一个异常——但是它不能抛出一个异常,因为 Log 类还没有被加载.因此我们得到ReflectionException的原因

在所有版本的 Laravel 中都发生过,我们看到 laravel 5.1 中抛出异常的唯一原因 Log class exception。

在我的特殊情况下,我没有安装 php-mysql 扩展,导致 Laravel 在启动过程中中断。

最终,由于错误非常具有误导性,因此很难调试您可能做错的事情。

我希望这对某人有所帮助!

编辑:关于如何调试此错误并找出哪些缺少扩展/组件实际上是导致问题的原因,请查看@Ben Johnson 的回答。

【讨论】:

是的,这是 Laravel 的静默行为……我遇到了这个问题,就我而言,我必须安装 php-mbstring 和 php-xml 扩展。所以基本上,如果我看到这个错误,我会检查并安装这里需要的扩展:laravel.com/docs/5.2(服务器要求)或其他如果包需要的话。 你是如何真正解决这个问题的? 我安装了缺少的php包php-mysql 'php70w-mysql' 在我的情况下丢失了。这个例外确实具有误导性。谢谢 @jakehallas 请您提及缺少的 php 包 php-mysql 和参考链接或说明【参考方案4】:

只是跑步

composer update

修复了问题。

【讨论】:

【参考方案5】:

当作曲家更新时,我认为 laravel 会进行一些验证。

如果未安装,请安装“解压缩”包(“sudo apt install unzip”)。 检查所有必需的扩展,例如“mysql”、“json”、“curl”、“xml”、“zip”等,如果没有安装,请安装(“sudo apt install php7.1-mysql”)。 检查您的文件/文件夹权限。 检查您的“.env”文件。 检查您的“配置”文件。 再次运行“作曲家更新”。

安装解压缩对我有用。祝你好运:)

【讨论】:

apt 不是 Centos 的一部分,您会考虑添加相关的存储库并改用 yum 是的,我的错,@moopet 是对的。我的解释是针对 ubuntu 的。其他发行版,如 centos,你应该像这样使用:“yum install php-mysql”。【参考方案6】:

在我的情况下,在我将分支合并到 master 后,我的配置文件 (config/app.php) 中缺少逗号。

这是一个语法错误,但没有显示出来。

【讨论】:

【参考方案7】:

我有一些负面的价值,比如

BUSINESS_RECONCILIATION_DAYS=-8

我需要包装

BUSINESS_RECONCILIATION_DAYS="-8"

【讨论】:

【参考方案8】:

在你的 .env 文件中确保你没有空格来代表值

例如这是允许的

DB_USERNAME=homestead

这是不允许的

DB_USERNAME=home stead

如果有空格,可以将值括在引号中。

DB_USERNAME="home stead"

真的希望他们使用 json 作为 .env 文件,也许我们应该请求该功能

【讨论】:

感谢您的回答。空格可能没有引起提问者的问题,但它肯定引起了我的问题。这个答案让我避免了一场看似漫长的追逐。【参考方案9】:

由于没有人提到管弦乐队/测试平台,但我想我只是将解决方案添加到我的问题中。

当我在一个单元测试中遇到这个错误时,我正在编写一个 Laravel 包。我使用 orchestra/testbench 来测试 Laravel 特定的代码部分。

问题只是测试类扩展了PHPUnit\Framework\TestCase,而不是Orchestra\Testbench\TestCase

【讨论】:

【参考方案10】:

运行php artisan config:cache 为我解决了这个问题。

或者,如果您在共享主机上无法访问终端/CMD,请将其添加到您的 Routs.php 文件中:

Route::get('/config-cache', function() 
    Artisan::call('config:cache');
    return '<h1>Config cache cleared successfully</h1>';
);

然后去yourdomain.com/config-cache运行这个脚本。

【讨论】:

【参考方案11】:

当您错过项目的任何依赖项时出现此类错误。 跑php composer.phar update

【讨论】:

【参考方案12】:

我遇到了同样的问题,这里的解决方案都没有解决

我发现config文件夹存在权限被拒绝的异常

修复权限后一切正常!


怎么算?

设置断点 vendor/laravel/framework/src/illluminate/Foundation/Http/Kernel.php

句柄函数的catch内的第101行。

这就是我发现权限被拒绝的方式。

【讨论】:

【参考方案13】:

我尝试了这里和其他地方提供的许多解决方案。它对我不起作用。我通过手动删除 /var/www/html/bootstrap/cache/compiled.php 并更新自动加载文件来解决它:

rm /var/www/html/bootstrap/cache/compiled.php
composer dump-autoload

【讨论】:

【参考方案14】:

.env 文件e 中删除空间后解决了这个问题(在 sublime 中查看 .env,因为 vi 编辑器不会在 .env 文件的末尾显示空间。) 并运行以下命令。

命令:

php artisan config:clear
php artisan cache:clear
composer dump-autoload
php artisan clear-compiled

【讨论】:

【参考方案15】:

此错误可能是由其中一个配置文件中的错误引起的。 要找到导致它的文件,请将 /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 命令... 祝你好运。

【讨论】:

【参考方案16】:

删除文件 bootstrap/cache/config.php 。这个文件可能不会在windows上显示,如果是这样,例如使用双命令。肯定会起作用的!

编辑:

这可能是缓存 .env 文件造成的,如果是你的情况,请尝试删除 bootstrap/cache/config.php

【讨论】:

【参考方案17】:

是的,正如@jakehallas 所说。它与异常中显示的内容无关。

实际上,如果有任何 dababase 问题或其他配置变量问题会导致此问题。

实际上,当我尝试更改 database.php 中的某些内容时,我只是复制了与 database-copy.php 相同的文件。我没有执行此导致问题。

在我删除这个 database-copy.php 文件之前完成了我所做的一切之后,它工作正常..

谢谢...

【讨论】:

【参考方案18】:
Uncaught ReflectionException: Class log does not exist

这个错误来自 laravel 5.2 & > 版本:

我的错误是:

提示1: 当您在配置文件中缺少 (;) 代码结尾时

其他语法错误这个错误来了。

我的错误代码:

<?php
return [
'data' => [
    'common' => [
        'AuthKey1' =>  "17086...........9a87a1",
        'AuthKey2' =>  "17086...........9a87a1",
        'AuthKey3'   =>  "17043...........59969531",
    ],
]
]

正确代码:Missing (;) End of return Array

<?php
return [
'data' => [
    'common' => [
        'AuthKey1' =>  "17086...........9a87a1",
        'AuthKey2' =>  "17086...........9a87a1",
        'AuthKey3'   =>  "17043...........59969531",
    ],
]
];

【讨论】:

或者在我的情况下,它只是数组值之间的逗号!在绝望地挠头之前,请使用 php 语法检查器仔细检查所有配置文件!【参考方案19】:

这也是由于 conf/ 目录.env 文件 中的某个文件中的语法错误。 在我的情况下,我收到了这个错误,因为我忘记在 conf/app.php 文件中的数组提供者和别名中添加服务提供者和外观时将::class 放在行尾。我更正了这一点,错误消失了。

【讨论】:

【参考方案20】:

就我而言,我在配置文件中使用了route() 方法。显然,这种方法不起作用,因为这些文件不使用 Illuminate Helper,它们是带有数据的简单 .php。

在实例化Log类之前读取配置文件,导致Jakehallas很好解释的错误。

【讨论】:

【参考方案21】:

编辑::

因为我不满意为了让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(撰写本文时的最新版本)

虚拟机:laravel/homestead (virtualbox 0.4.0)

Laravel 版本:5.1.*

PHP:7.0.*


经过多次尝试解决问题,其中包括:

    重写、删除 .env 以解决潜在的解析问题 php7.1 和 mcrypt / mbstring 问题 安装 composer 建议的包 正在更新 homestead.rb PATH 相关问题

至关重要的是,(对我而言)它似乎是初始设置中的 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

【讨论】:

【参考方案22】:

此问题通常是由 .env 文件中的单词之间的空格引起的。 确保你有类似的东西

SITE_DESCRIPTION = Social Network for dogs

你把它替换为

SITE_DESCRIPTION = 'Social Network for dogs'

【讨论】:

【参考方案23】:

通过修改 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 。

【讨论】:

这回顾了被抛出的真正异常 - 那是我试图使用在配置文件 (config/) 中使用 Facade 的方法。 这有帮助,但并没有解决整个问题。我也得到了类配置丢失的错误,帮助在日志类之后添加这个:inline class config extends \Illuminate\Log\Writer function __construct() $this-&gt;monolog = new Monolog("local"); public function get($test, $test2) return $test; 添加一行` $this->monolog->pushHandler(new \Monolog\Handler\StreamHandler('/tmp/log.txt')); ` 实际写日志,可以揭示原因 'PHPExcel_Shared_Font' not found in app/config.php' 是我必须删除文件并更新作曲家的真正错误。这段代码显示了真正的错误。谢谢 太棒了!这个解决方法真的拯救了我的一天 :) 原来有人决定忽略 composer.lock 所以本地开发和我们的构建服务器不同步并且包最终没有被安装。【参考方案24】:

就我而言,缺少 PDO 扩展是问题所在。安装后问题解决了。

【讨论】:

【参考方案25】:

我在 CLI 中输入了一个 CMD,但不小心在应用程序配置文件中输入了它。我必须遵循这个程序才能找到问题。

解决方案,如何发现问题:

制作配置文件夹的备份副本。尝试删除一个配置 时间并尝试运行失败的 composer/artisan 命令。当你 查找失败的文件 - 搜索可能失败的行。 失败的原因是:你使用了未加载的类常量 还没有。您使用尚未加载的类/函数。等等

https://laracasts.com/discuss/channels/general-discussion/class-log-does-not-exist?page=2

【讨论】:

【参考方案26】:

在我的 .env 文件中添加几行后,我注意到了同样的行为。没有引号的空格是不允许的,因此可以这样修复:

APP_YOUR_NAME="A value with some spaces"

【讨论】:

以上是关于未捕获的 ReflectionException:类日志不存在 Laravel 5.2的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 错误:未捕获的 ReflectionException:类 App\Http\Kernel 不存在

未捕获的 ReflectionException:特使部署中不存在类哈希

Laravel 错误未捕获的异常 'ReflectionException' 并带有消息'Class App\Http\Kernel 不存在'

未捕获的 ReflectionException:类日志不存在 Laravel 5.2

在 vendor\laravel\framework\src\Illuminate\Container\Container.php 中未捕获的异常 'ReflectionException' 和消息

解决未捕获的ReflectionException:C: ... Container.php中不存在类日志: