Uncaught ReflectionException:类日志不存在Laravel 5.2

jak*_*las 41 php laravel centos7 laravel-5.2

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

Uncaught ReflectionException: Class log does not exist

我在Centos 7上运行Laravel 5.2.

我看过参考文献:

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

我有:

  • 用我.env的替换example.env来避免任何自定义配置错误.
  • 我已经删除并重新克隆了回购.
  • 我已经使用了composer.jsonLaravel附带的默认值来查看是否会产生影响.

以上都没有给我带来任何快乐.我也在另一台机器上设置相同的环境,应用程序正常工作.这里唯一的区别是机器(工作)没有从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
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.提前致谢.

jak*_*las 52

好的,经过几个小时的挖掘,找到了我的问题的解决方案.我之所以说我的问题是因为这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在启动过程中中断.

最终,由于错误引导错误,调试您可能做错的事情是非常困难的.

我希望这可以帮助别人!

  • 我安装了缺少的php包`php-mysql` (3认同)

Ric*_*ato 33

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

例如,这是允许的

DB_USERNAME=homestead
Run Code Online (Sandbox Code Playgroud)

这是不允许的

DB_USERNAME=home stead
Run Code Online (Sandbox Code Playgroud)

如果有空格,可以用引号括起来.

DB_USERNAME="home stead"
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您的回答。空格可能不会给提问者带来问题,但它肯定引起了我的问题。这个答案让我避免了一场看似漫长的徒劳追逐。 (2认同)

Ben*_*son 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.

    //...
}
Run Code Online (Sandbox Code Playgroud)

(感谢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配置文件中定义闭包.

  • 这审查了抛出的真正异常 - 那是我试图使用一种在配置文件(config/)中使用 Facade 的方法。 (2认同)

Eps*_*n47 10

删除文件bootstrap/cache/config.php.此文件可能不会显示在Windows上,如果是这样,请使用双指令器.Definitelly会工作!

编辑:

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


Ben*_*Ben 5

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

APP_YOUR_NAME="A value with some spaces"