user6562256
user6562256

Reputation: 137

Laravel 5 - Class 'DB' not found

I have ChatController located in app/http/controllers like so:

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use DB;

class ChatController extends Controller implements MessageComponentInterface {

    protected $clients;

    function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) 
    {
        $this->clients->attach($conn);
    }

    public function onMessage(ConnectionInterface $conn, $msg) 
    {
        foreach ($this->clients as $client) 
        {
            if ($client !== $conn )
                $client->send($msg); 

            DB::table('messages')->insert(
                ['message' => $msg]
            );
        }
    }

    public function onClose(ConnectionInterface $conn) 
    {
        $this->clients->detach($conn);
    }

    public function onError(ConnectionInterface $conn, \Exception $e) 
    {
        echo 'the following error occured: ' . $e->getMessage();
        $conn->close();
    }

}

And I have chatserver.php file in the root like so:

<?php
require  'vendor/autoload.php';

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use App\Http\Controllers\ChatController;


$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new ChatController()
        )
    ),
    8080
);

$server->run();

If I remove

DB::table('messages')->insert(
                    ['message' => $msg]
                );

from the ChatController and start chatserver.php it works, but if I don't remove it then the server starts but as soon as I send a message I get this error:

Fatal error: Uncaught Error: Class 'DB' not found in C:\wamp\www\laraveltesting\app\Http\Controllers\ChatController.php:31

Why won't it use DB? I am extending the laravel controller.

Upvotes: 8

Views: 19184

Answers (6)

billrichards
billrichards

Reputation: 2060

Add this in your test class file (before the class keyword) so your test can find the location of the Laravel application and create a new app.

if (!isset($app)) {
    $app = new \Illuminate\Foundation\Application(
          // E.g. if the current dir is app/tests/Unit/
          // Your path may differ
        realpath(__DIR__.'/../../')
    );
}

And in the test methods where you want to use DB, add global $app

public function testSomething()
{
    global $app;
    //
}

Upvotes: 0

Deddy Supa
Deddy Supa

Reputation: 11

change use Illuminate\Support\Facades\DB; to Use DB;

Upvotes: 1

Miguellito
Miguellito

Reputation: 21

for Laravel 5 and up simply just use this

use DB;

instead of

use Illuminate\Support\Facades\DB;

which is use for Laravel 4 version

Upvotes: 1

Ndeto
Ndeto

Reputation: 315

As previously advised First use

use Illuminate\Support\Facades\DB;

then go /bootstrap/app.php and uncomment

$app->withFacades();

Upvotes: 2

Sibasankar Bhoi
Sibasankar Bhoi

Reputation: 589

This one is better

use Illuminate\Support\Facades\DB;

Or you can use a slash('/') before DB like below

/DB::table('messages')->insert(
                ['message' => $msg]
            );

Upvotes: 10

jonju
jonju

Reputation: 2736

try using this

use Illuminate\Support\Facades\DB;

instead of

use DB;

Upvotes: 2

Related Questions