Eloquent错误:尚未设置外观根

时间:2016-02-15 20:49:28

标签: eloquent illuminate-container

我已成功将Eloquent用作Slim Framework 2中的独立包。

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

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

我该如何解决?

到目前为止,我发现在this link中我需要创建一个新的app容器,然后将其绑定到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();

13 个答案:

答案 0 :(得分:41)

您必须将代码更改为:

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

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

use Illuminate\Database\Capsule\Manager as DB;

答案 1 :(得分:14)

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

   use PHPUnit\Framework\TestCase;

与:

 use Tests\TestCase;

答案 2 :(得分:7)

为什么有人标记答案没有用,它对我来说非常有效。我正在使用use Illuminate\Support\Facades\DB as DB;,但在将胶囊设置为全局use Illuminate\Database\Capsule\Manager as DB;之后,这可以$capsule->setAsGlobal();

答案 3 :(得分:6)

尝试uncommited app.php $ app-&gt; withFacades();

答案 4 :(得分:1)

运行后出现此错误:

$ php artisan config:cache

对我来说,解决方案是删除/bootstrap/cache/config.php文件。我正在运行Laravel 5.5。

这种现象似乎在多种情况下发生,而不仅仅是外墙。

答案 5 :(得分:0)

如果您最近在Homestead&VirtualBox环境上升级了Laravel或找不到任何引起原因的原因,请确保您的Vagrant是最新的。

Referance

  

我让Taylor锁定了该线程。过去的几封答复都重申了该解决方案,即“升级到Virtualbox 6.x”,该线程已锁定,以防止在此处无关紧要的其他问题被解决。

答案 6 :(得分:0)

错误的方式

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

正确的方式?

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

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

答案 7 :(得分:0)

在我的项目中,我在实例化对象时通过使用Laravel Dependency Injection解决了这个问题。以前我是这样的:

$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中了解更多信息。

答案 8 :(得分:0)

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

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

我终于找到了问题,因为我正在使用bensampo/laravel-enum库,并且在配置文件中使用了类似于以下内容的语句,


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

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

答案 9 :(得分:0)

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

你能尝试

php artisan serve --port=8080

了解更多详细错误。

答案 10 :(得分:0)

使用phpUnit测试laravel的一个随机问题是测试时尚未初始化laravel外观。

代替使用标准的PHPUnit TestCase类

class MyTestClass extends PHPUnit\Framework\TestCase

一个人可以使用

class UserTest extends Illuminate\Foundation\Testing\TestCase

这个问题就解决了。

答案 11 :(得分:0)

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

<块引用>

PHP 致命错误: Uncaught RuntimeException: A Facade root has not 被设置。在 path_to_project/vendor/illuminate/support/Facades/Facade.php:258

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

这个错误实际上是由于我在 Illuminate\Support\Facades\DB 中的配置而引发的,它没有指向我的 app.php 文件,我实际启用了门面 >.

我只是不得不改变

phpunit.xml

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

希望有帮助。

答案 12 :(得分:0)

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

$ php artisan config:cache

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