62

我一直在 Slim Framework 2 中成功地使用 Eloquent 作为独立包。

但是现在我想使用 Illuminate\Support\Facades\DB 因为我需要通过从 2 个表中获取信息并使用数据库中的左连接和计数器来显示一些统计信息,如下所示:

use Illuminate\Support\Facades\DB;
$projectsbyarea = DB::table('projects AS p')
        ->select(DB::raw('DISTINCT a.area, COUNT(a.area) AS Quantity'))
        ->leftJoin('areas AS a','p.area_id','=','a.id')
        ->where('p.status','in_process')
        ->where('a.area','<>','NULL')
        ->orderBy('p.area_id');

我收到以下错误:

Type: RuntimeException
Message: A facade root has not been set.
File: ...\vendor\illuminate\support\Facades\Facade.php
Line: 206

我该如何解决?

到目前为止,我已经发现,在这个链接中,我需要创建一个新的应用程序容器,然后将它绑定到 Facade。但我还没有找到如何使它工作。

这就是我如何开始我的 Eloquent 的其余部分并且工作正常:

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule();

$capsule->addConnection([
    'my'         =>  $app->config->get('settings'),
    /* more settings ...*/
]);

/*booting Eloquent*/
$capsule->bootEloquent();

我该如何解决?

已修复 正如@user5972059 所说,我必须在$capsule->setAsGlobal();//This is important to make work the DB (Capsule)上面添加$capsule->bootEloquent();

然后,查询是这样执行的:

use Illuminate\Database\Capsule\Manager as Capsule;
$projectsbyarea = Capsule::table('projects AS p')
            ->select(DB::raw('DISTINCT a.area, COUNT(a.area) AS Quantity'))
            ->leftJoin('areas AS a','p.area_id','=','a.id')
            ->where('p.status','in_process')
            ->where('a.area','<>','NULL')
            ->orderBy('p.area_id')
            ->get();
4

16 回答 16

70

您必须将代码更改为:

$Capsule = new Capsule;
$Capsule->addConnection(config::get('database'));
$Capsule->setAsGlobal();  //this is important
$Capsule->bootEloquent();

在类文件的开头,您必须导入:

use Illuminate\Database\Capsule\Manager as DB;
于 2016-02-24T03:11:40.907 回答
55

我刚刚通过$app->withFacades();在 bootstrap/app.php 中取消注释解决了这个问题

于 2017-05-08T14:16:38.580 回答
28

尝试在 app.php 中取消注释$app->withFacades();

于 2017-08-04T08:57:07.833 回答
26

与 laravel 8 有同样的问题。我替换了

   use PHPUnit\Framework\TestCase;

和:

 use Tests\TestCase;
于 2021-02-15T08:36:49.977 回答
9

对 laravel 使用 phpUnit 测试的一个随机问题是 laravel 外观在测试时没有被初始化。

而不是使用标准的 PHPUnit TestCase 类

class MyTestClass extends PHPUnit\Framework\TestCase

一个可以使用

class UserTest extends Illuminate\Foundation\Testing\TestCase

这个问题就解决了。

于 2020-12-16T08:56:01.977 回答
4

之前不要忘记打电话parent::setUp();

失败

public function setUp(): void {
    Config::set('something', true);
}

作品

public function setUp(): void {
    parent::setUp();

    Config::set('something', true);
}
于 2021-10-22T13:32:32.793 回答
3

运行后出现此错误:

$ php artisan config:cache

我的解决方案是删除该/bootstrap/cache/config.php文件。我正在运行 Laravel 5.5。

似乎出现在多种情况下,而不仅仅是外墙。

于 2020-02-14T19:54:44.243 回答
1

我在使用 PHPUnit v.9.5.4、PHP v.8.0.3 和 Lumen v.8.2.2 运行测试时收到以下消息:

PHP 致命错误:未捕获的 RuntimeException:尚未设置外观根。在 path_to_project/vendor/illuminate/support/Facades/Facade.php:258

尽管我显然已经将 app.php 配置为启用外观 ( $app->withFacades();),但这种情况发生了,但每当我尝试使用Illuminate\Support\Facades\DB. 不幸的是,其他答案都没有帮助我。

这个错误实际上是由于我的配置而引发phpunit.xml,它没有指向我的 app.php 文件,我实际上在该文件中启用了 facades

我只需要改变

<phpunit (...OTHER_PARAMS_HERE) bootstrap="vendor/autoload.php">

<phpunit (...OTHER_PARAMS_HERE) bootstrap="bootstrap/app.php">

希望能帮助到你。

于 2021-03-29T08:01:03.223 回答
1

错误道

public function register()
   {
       $this->app->bind('Activity', function($app)
       {
            new Activity;
       });
   }

正确的路

public function register()
   {
       $this->app->bind('Activity', function($app)
       {
            return new Activity;
       });
   }

---------------------------------- 不要忘记返回

于 2019-09-19T07:20:19.420 回答
1

php升级版,调用接口时遇到这个错误。

$ php工匠配置:缓存

删除 /bootstrap/cache/config.php 文件是一种非常有效的方法。

于 2021-06-10T08:41:39.213 回答
0

就我而言,所有外观都不可用,包括工匠的任何命令。

我尝试删除供应商并重新安装,但问题仍然存在。

终于找到问题了,因为我在使用bensampo/laravel-enum库,在一个配置文件中使用了类似下面的语句,


'name' =>\App\Enums\VipLevelEnum::getDescription(
    \App\Enums\VipLevelEnum::GOLD
)

由于尚未加载 Lang 外观,这可能会导致错误(我猜)

于 2020-08-07T14:25:39.900 回答
0

你的错误可能是每一件事。当您在 Apache 服务器上使用 laravel 时,您可能看不到错误的详细信息。

你能试一下吗

php artisan serve --port=8080

有关更详细的错误。

于 2020-08-18T10:09:37.473 回答
0

就我而言,有一段时间在 PHP 版本 8 中运行了一个 PHP 项目,那时我使用了一些 PHP 8 功能,例如参数定义和方法的多个返回类型声明,仅受 PHP 8 及更高版本支持。当我从 PHP 8 降级到 PHP 7.4 时,我遇到了这个问题。删除返回类型和参数提示后,问题就消失了。

于 2021-10-19T16:41:28.340 回答
0

如果你最近在 Homestead 和 VirtualBox 环境中升级 Laravel 或者没有找到任何导致的原因,请确保你的 Vagrant 是最新的。

参考

我让泰勒锁定了这个线程。之前的几个回复都重述了解决方案,就是升级到Virtualbox 6.x,线程被锁定,防止其他不相关的问题在这里被纠缠。

于 2019-07-24T13:24:24.650 回答
0

在我的项目中,我在实例化对象时设法通过使用 Laravel 依赖注入解决了这个问题。以前我是这样的:

$class = new MyClass(
    new Client(),
    env('client_id', 'test'), 
    Config::get('myapp.client_secret')
);

当我使用 Laravel env() 和 Config() 时,发生了同样的错误消息。

我在 AppServiceProvider 中介绍了 Client 和 env,如下所示:

     $this->app->bind(
         MyClass::class,
         function () {
             return new MyClass(
                 new Client(),
                 env('client_id', 'test')),
                 Config::get('myapp.client_secret')
             );
         }

然后像这样实例化类:

$class = app(MyClass::class);

从https://laravel.com/docs/5.8/container查看更多信息。

于 2020-03-07T10:59:34.313 回答
0

在 Laravel 8.78 上测试

测试/bootstrap.php

<?php

use Illuminate\Foundation\Bootstrap\RegisterFacades;
use Illuminate\Foundation\Bootstrap\LoadConfiguration;

require_once __DIR__ . '/../vendor/autoload.php';

$app = require_once __DIR__ . '/../bootstrap/app.php';

(new LoadConfiguration())->bootstrap($app);//  <------- Required for next line
(new RegisterFacades())->bootstrap($app);//  <------- Add this line
于 2022-01-17T15:42:51.410 回答