未捕获的 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 的方法。 这有帮助,但并没有解决整个问题。我也得到了类配置丢失的错误,帮助在日志类之后添加这个:inlineclass config extends \Illuminate\Log\Writer function __construct() $this->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' 和消息