【问题标题】:Accessing Eloquent ORM inside Ratchet's MessageComponentInterface在 Ratchet 的 MessageComponentInterface 中访问 Eloquent ORM
【发布时间】:2021-09-29 22:24:29
【问题描述】:

标题令人困惑。基本上,我无法在不属于框架的类中访问 Laravel 的实用程序。

错误是:Call to a member function connection() on null in C:\xampp\htdocs\blazocket\vendor\laravel\framework\src\Illuminate\Databas e\Eloquent\Model.php:1571

我有一个基于 Ratchet 库的 Websocket 服务器,它具有以下结构:

namespace App\Http\Websockets;
$server = new \Ratchet\App('localhost', 8080);
$server->route('/api/socket', new WebSocketHandler, array('*'));

来自 WebSocketHandler 的片段:

namespace App\Http\Websockets;
use App\Models\Website;

class WebSocketHandler implements MessageComponentInterface {



    protected $apis;
    protected $clients;

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

    private function refreshDatabase(){
      $this->apis = Website::all();
    }

}

我试过这样做:

$app = require dirname( __FILE__ ) . '/../../../bootstrap/app.php';
$app->boot();

但这不是解决方案(我从另一个 SO 问题尝试过)。另外,我读过this,但我不确定我可以实现“引导”的方式。

我知道错误正在发生,因为类 (WebSocketHandler) 和 Laravel 框架之间没有连接。我已经尝试了每一个答案,并检查了文档,我自己找不到一种方法来连接这个类。

非常感谢您的帮助。

【问题讨论】:

  • 所以基本上,你有一个 Laravel 项目,并且你在 Laravel 项目中安装了带有 composer require 的 Ratchet?如果是 - 你应该作曲家转储自动加载。如果没有——并且你安装在其他地方——没有必要认为它由于缺少一些东西而无法工作。它不起作用,因为它们是不同的项目并且使用来自 /vendor/composer 的不同自动加载器。我建议将它安装在 laravel 项目中。但是,如果你不能这样做,你可以创建一个新的作曲家项目。需要棘轮并添加自动加载的路径,以及laravel项目的完整路径。
  • 你声明了命名空间吗?

标签: php laravel websocket eloquent ratchet


【解决方案1】:

你需要启动(Idk 正确的术语)Laravel 并使其可用于与 Laravel 无关的自定义类的明显答案。

我确实有这种方式仅用于数据库连接。首先,将这些添加到您的班级顶部:

use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

然后,在您的类中创建一个新方法,并在初始化后调用它。

private function setupLaravel(){
  $capsule = new Capsule;
  $capsule->addConnection([
  'driver' => 'mysql',
  'host' => 'localhost',
  'database' => 'mydatabase',
  'username' => 'root',
  'password' => "",
  ]);
  $capsule->setEventDispatcher(new Dispatcher(new Container));
  $capsule->setAsGlobal();
  $capsule->bootEloquent();
} 

如果您正在运行 Ratchet 并希望通过 Eloquent ORM 访问数据库,这就是方式。

【讨论】:

    【解决方案2】:

    您错过了声明命名空间。如你所见here

    有一个命名空间声明。

    【讨论】:

    • 我已经在原始文件中找到了它,但仍然无法正常工作。
    • 你能准确地发布你所拥有的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多