Laravel/Eloquent:致命错误:调用非对象上的成员函数 connection()

新手上路,请多包涵

我正在 Laravel 4 中构建一个包,但在尝试访问似乎是正确实例化对象的数据库时出现非对象错误。这是设置:

有问题的配置和类:

作曲家.json:

 ...
"autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ],
        "psr-0": {
            "Vendor\\Chat": "src/vendor/chat/src"
        }
    }
...

班上:

 namespace Vendor\Chat;

use Illuminate\Database\Eloquent\Model as Eloquent;

class ChatHistory extends Eloquent
{
    protected $table = 'chat_history';

    protected $fillable = array('message', 'user_id', 'room_token');

    public function __construct($attributes = array())
    {
        parent::__construct($attributes);
    }

}

电话:

 $message = new Message($msg);

$history = new ChatHistory;
$history->create(array(
                 'room_token' => $message->getRoomToken(),
                 'user_id' => $message->getUserId(),
                 'message' => $message->getMessage(),
              ));

错误:

 PHP Fatal error:  Call to a member function connection() on a non-object in /home/vagrant/project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 2894

我相信我在我的眼皮底下遗漏了一些基本的东西。感谢您提供的所有帮助!

编辑:

这是实例化 ChatHistory 并调用 write 的类:

 namespace Vendor\Chat;

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

use Vendor\Chat\Client;
use Vendor\Chat\Message;
use Vendor\Chat\ChatHistory;

use Illuminate\Database\Model;

class Chat implements MessageComponentInterface {

    protected $app;

    protected $clients;

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

    public function onOpen(ConnectionInterface $conn)
    {
        $client = new Client;
        $client->setId($conn->resourceId);
        $client->setSocket($conn);

        $this->clients->attach($client);
    }

    public function onMessage(ConnectionInterface $conn, $msg)
    {
        $message = new Message($msg);

        $history = new ChatHistory;
        ChatHistory::create(array(
                     'room_token' => $message->getRoomToken(),
                     'user_id' => $message->getUserId(),
                     'message' => $message->getMessage(),
                  ));
        /* error here */
        /* ... */
    }

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

    public function onError(ConnectionInterface $conn, \Exception $e)
    {
        $conn->close();
    }

    protected function getClientByConn(ConnectionInterface $conn)
    {
        foreach($this->clients as $client) {
            if($client->getSocket() === $conn) {
                return $client;
            }
        }

        return null;
    }
}

DB 不可用这一事实表明 Eloquent 没有被加载到顶部?

原文由 J. LaRosee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 285
2 个回答

回答

在您的服务提供商的 boot 方法中引导您的包。


解释

因为你正在开发一个与 Laravel 一起使用的包,所以没有必要制作你自己的 Capsule 实例。您可以直接使用 Eloquent

您的问题似乎源于 DB / Eloquent 在您的代码命中时尚未设置。

您没有向我们展示您的服务提供商,但我猜您正在使用一个并在 register 方法中完成所有操作。

由于您的包依赖于不同的服务提供商 ( DatabaseServiceProvider ) 在其自身执行之前进行连接,因此引导您的包的正确位置是在您的服务提供商的 boot 方法中。

这是 文档中 的引述:

register 方法在注册服务提供商时立即调用,而 boot 命令仅在路由请求之前调用。

因此,如果您的服务提供商中的操作依赖于另一个已经注册的服务提供商 […],您应该使用 boot 方法。

原文由 Joseph Silber 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您使用 Lumen,您可能会遇到同样的问题。在这种情况下,只需取消注释:

 // $app->withFacades();

// $app->withEloquent();

bootstrap\app.php

原文由 Kamil Szymański 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏