添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
怕老婆的海龟  ·  python ...·  1 年前    · 
活泼的抽屉  ·  mysql ...·  1 年前    · 
睡不着的地瓜  ·  php - Mysql "too many ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I have been using Eloquent as a standalone package in Slim Framework 2 successfully.

But now that I want to make use of Illuminate\Support\Facades\DB since I need to show some statistics by getting the info from 2 tables and using a Left Join and a Counter from the database like this:

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');

I get the following error:

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

How can I solve it?

So far I have found out, in this link that I need to create a new app container and then bind it to the Facade. But I haven't found out how to make it work.

This is how I started the rest of my Eloquent and working fine:

use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule();
$capsule->addConnection([
    'my'         =>  $app->config->get('settings'),
    /* more settings ...*/
/*booting Eloquent*/
$capsule->bootEloquent();

How do I fix this?

Fixed As @user5972059 said, I had to add $capsule->setAsGlobal();//This is important to make work the DB (Capsule) just above $capsule->bootEloquent();

Then, the query is executed like this:

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();
                I got this "A facade root has not been set" error when I was trying to use the Laravel url('/') helper within a config file.
– Ryan
                Dec 13, 2018 at 1:37
$Capsule = new Capsule;
$Capsule->addConnection(config::get('database'));
$Capsule->setAsGlobal();  //this is important
$Capsule->bootEloquent();

And at the beginning of your class file you have to import:

use Illuminate\Database\Capsule\Manager as DB;
                where do I put this?   I'm getting that error after upgrading to Laravel 5.4:  i.gyazo.com/a664efbe34aea117d2bbb8a8ad448951.png
– Altin
                Mar 1, 2017 at 0:46
                Its started working for me after adding this line use Illuminate\Database\Capsule\Manager as DB;  but  I have checked Manager class and there is no any methods exists related to transaction, than how it's working
– Gohel Kiran
                Apr 13, 2020 at 17:41
                This worked for me!  I'm dealing with a legacy code base that was upgraded from Lumen to Laravel.  The prior dev team did not upgrade the test suite...
– danielricecodes
                Apr 9, 2021 at 17:43
                This solved it for me. Interestingly I was using a brand new install of Laravel 8, and the ExampleTest.php that ships is extending the PHPUnit class.
– JazzyP
                Jul 17, 2021 at 10:00

One random problem using phpUnit tests for laravel is that the laravel facades have not been initialized when testing.

Instead of using the standard PHPUnit TestCase class

class MyTestClass extends PHPUnit\Framework\TestCase

one can use

class UserTest extends Illuminate\Foundation\Testing\TestCase

and this problem is solved.

This one is easier than the accepted answer, but if you're using Laravel 8, @melvin's answer below is even better. For this one to work, you have to use CreatesApplication trait in your unit test class. @melvin's answer OTOH doesn't require anything else. – dotNET Mar 31, 2021 at 15:39

$ php artisan config:cache

The solution for me was to delete the /bootstrap/cache/config.php file. I'm running Laravel 5.5.

The seems to arise in multiple situation, and not just about facades.

I received the following message while running tests using PHPUnit v.9.5.4, PHP v.8.0.3 and Lumen v. 8.2.2:

PHP Fatal error: Uncaught RuntimeException: A facade root has not been set. in path_to_project/vendor/illuminate/support/Facades/Facade.php:258

And that happened although I had apparently already configured my app.php to enable facades ($app->withFacades();), still I received this error message whenever I tried to run tests using Illuminate\Support\Facades\DB. Unfortunately, none of the other answers helped me.

This error was actually been thrown due to my configs in phpunit.xml, which didn't point to my app.php file, where I actually enabled facades.

I just had to change

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

Hope it helps.

Upgrade version for php, I encountered this error while calling the interface.

$ php artisan config:cache

Deleting the /bootstrap/cache/config.php file is a very effective way.

In my project, I managed to fix this issue by using Laravel Dependency Injection when instantiating the object. Previously I had it like this:

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

The same error message happened when I used Laravel env() and Config().

I introduced the Client and env in the AppServiceProvider like this:

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

and then instantiated the class like this:

$class = app(MyClass::class);

See more from https://laravel.com/docs/5.8/container .

In my case, for a while a ran a PHP project in PHP version 8, and that time I used some PHP 8 features like param definition and method's multiple return type declarations supported by only PHP 8 and above. When I downgraded from PHP 8 to PHP 7.4 I faced this issue. After removing the return types and param hinting the problems are gone.

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

Here is yet another instance of this error, happened to me after upgrading Laravel 8 to 9.

I had feature tests with a @dataProvider to supply data to those tests. Some of the data supplied by the data provider methods came from an application service. It was being initialised like this:

* @dataProvider myDataProvider public function testSomeStuff(...) public function myDataProvider() $myService = app(Service::class); // This is trouble return [ ['test1_data' => $myService::SOME_CONSTANT], [...],

This worked under Laravel 8, but not in Laravel 9. All other solutions listed in this SO thread were checked and were correctly set up.

The problem is that the application is not being inititialised until after the data provider method is run. It was presumably initialised before this stage in the Laravel 8 install. So app(Service::class) was failing due to it using facades internally.

One workaround could be to force the application to initialise earlier, in the data provider function: $this->createApplication(). I would not recommend this due to potential side effects of the test parts running in the wrong order, though it does appear to work when I tried it.

Best solution is to avoid accessing any part of the application functionality in the data provider methods. In my case it was easy to replace $myService::SOME_CONSTANT with MyService::SOME_CONSTANT after making sure those constants were public.

Hopefully this will help somebody suddenly hitting this problem running feature tests after a Laravel 9 upgrade.

If you are running test in separate processes, don't forget to use @preserveGlobalState disabled I was seeing this error, and this is how I solved it:

Before

* @runTestsInSeparateProcesses

After

* @runTestsInSeparateProcesses * @preserveGlobalState disabled

After a long back and forth I found that my issue was server setup. More exactly, I had multiple php versions. For some reason the problem was that even though I had installed php8.2 it was not set the default version on the server. But after I disabled 8.1 and set the default php version on the server to 8.2 the problem disappeared.

If you recently upgrade Laravel on Homestead & VirtualBox environment or do not find any reason that causing please be sure your Vagrant is up to date.

Referance

I had Taylor lock this thread. The past several replies have restated the solution, which is to Upgrade to Virtualbox 6.x, the thread is locked to prevent other issues that are not related from being dogpiled on here.

@melvin's answer above works correctly.

In case someone is wondering about it, the mistake people do is to choose Yes when VSCode asks them if they are making a Unit Test. Remember, Unit Tests should really be unit tests, independent of other application features (models, factories, routes; basically anything that would require the Laravel app to be fired up). In most scenarios, people really actually want to make Feature Tests and therefore should answer No to the above question. A feature test inherits from Tests\TestCase class (which takes care of firing up Laravel app before running the test) unlike unit tests that inherit from the class PHPUnit\Framework\TestCase which use just PHPUnit and are therefore much faster.

credit with thanks to @Aken Roberts's answer here.

From Laravel Documentation: Generally, most of your tests should be feature tests. These types of tests provide the most confidence that your system as a whole is functioning as intended.