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

Uncaught ReflectionException: Class log does not exist Laravel 5.2

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

Uncaught ReflectionException: Class log does not exist

我在 Centos 7 上 运行ning Laravel 5.2。

我看到了对以下内容的引用:

我有:

None 以上这些都给我带来了快乐。我还在另一台机器上设置了相同的环境,应用程序运行良好。这里唯一的区别是机器(工作)不是从 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

如有任何帮助,我们将不胜感激。提前致谢。

好的,经过数小时的挖掘,我的问题 的解决方案已经找到。之所以说我的问题是因为Exception很mis-leading。

Uncaught ReflectionException: Class log does not exist

此异常仅表示 Laravel 尝试记录错误但无法实例化 Laravel 的 Log class。这不是由于日志 class 变为 walk-abouts 或隐藏。这是因为 Laravel 仍在进行启动过程并且尚未加载 Log class。

因此,抛出此异常是因为在 Laravel 的启动周期期间发生错误 - 当此错误发生时它试图抛出异常 - 但它不能抛出异常,因为 Log class 尚未加载。因此我们得到 ReflectionException

的原因

这个在Laravel的所有版本中都发生过,我们在laravel 5.1<=中看到异常抛出的唯一原因是因为之前Laravel 默默地放弃了问题并继续其启动过程 - 基本上,您的应用程序仍会中断,但您不会收到 Log class exception

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

最终,由于错误非常 mis-leading,调试您可能做错的事情非常困难。

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

编辑: 关于如何调试此错误并找出缺少 extension/component 的实际原因,请查看@Ben Johnson 的回答。

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

例如,这是允许的

DB_USERNAME=homestead

这是不允许的

DB_USERNAME=home stead

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

DB_USERNAME="home stead"

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

我在 CLI 中键入 CMD,不小心将其键入到应用程序配置文件中。为了找到问题,我必须遵循这个过程。

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

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

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

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

APP_YOUR_NAME="A value with some spaces"

在我的例子中,缺少 PDO 扩展是问题所在。安装后问题解决

通过修改 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)。此表现的解决方案:根据 https://github.com/laravel/framework/issues/9625 .

,不要在 Laravel 配置文件中定义闭包

这个问题一般是.env文件中的单词之间有空格引起的。 确保你有类似

的东西
SITE_DESCRIPTION = Social Network for dogs

你把它换成

SITE_DESCRIPTION = 'Social Network for dogs'

编辑::

因为我不满意相当笨拙的调试和修改路径等来顺利获得 VM 运行,我反思了这个过程并重新安装了 vagrant box laravel/homestead (virtualbox 1.0.1)

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


这不是一个直接的答案,但更像是一个指南 post 那些冒险进入这个无声错误深渊的人

系统:macOS Sierra

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

虚拟机:laravel/homestead (virtualbox 0.4.0)

Laravel版本:5.1.*

PHP: 7.0.*


经过反复尝试解决的问题包括:

  1. 重写,删除 .env 以解决潜在的解析问题
  2. php7.1 和 mcrypt/mbstring 问题
  3. 正在安装作曲家建议的软件包
  4. 正在更新homestead.rb
  5. 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

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

在实例化日志class之前读取配置文件,这导致解释得很好的错误。

删除文件 bootstrap/cache/config.php。 windows 上可能不会显示此文件,如果是,请使用双命令器。绝对有效!

编辑:

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

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

Uncaught ReflectionException: Class log does not exist

出现此错误 laravel 5.2 & > 版本:

我的错误是:

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

Other syntax Error 这个错误来了

我的错误代码:

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

正确代码:缺少 (;) return 数组的结尾

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

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

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

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

在完成删除数据库之前所做的工作之后-copy.php 文件工作正常..

谢谢...

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

.env file 中删除 space 后解决了这个问题(在 sublime 中查看 .env 因为 vi 编辑器不显示 space 在 .env 文件的末尾。) 和命令下方的 运行。

命令:

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

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

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

我遇到了同样的问题,none 这里的解决方案已经解决

我发现 config 文件夹

的权限被拒绝的例外情况

修复权限后一切正常!


怎么算的?

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

handle 函数的 catch 中的第 101 行。

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

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

运行 php artisan config:cache 帮我解决了。

或者,如果您使用的是共享主机而无法访问 Terminal/CMD,请将其添加到您的 Routs.php 文件中:

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

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

因为没有人提到 orchestra/testbench 但我想我应该添加解决我的问题的方法。

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

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

我有一些负值,比如

BUSINESS_RECONCILIATION_DAYS=-8

我需要包装

BUSINESS_RECONCILIATION_DAYS="-8"

就我而言,在我将分支合并到 master 后,我的配置文件 (config/app.php) 中缺少一个逗号。

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

当作曲家更新时,我想 laravel 会做一些验证。

  • 安装 "unzip" 包("sudo apt install unzip")如果没有安装。
  • 检查所有必需的扩展,例如 "mysql"、"json"、"curl"、"xml"、"zip" 等,然后安装("sudo apt install php7.1-mysql") 如果没有安装。
  • 检查您的 file/folder 权限。
  • 检查您的“.env”文件。
  • 检查您的 "config" 个文件。
  • 运行 "composer update" 再一次。

安装 unzip 对我有用。祝你好运:)

就运行

composer update

已解决问题。

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

中不再可能

我们发现这个的方法是在 src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php.

的 loadConfigurationFiles 方法中检查哪个文件加载失败

即使这是一个旧话题,希望我的回答有一天能对某人(比如我)有所帮助。 就我而言,我发现我应该 运行 来自终端的 artisan 像这样:

sudo php artisan command

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