我已经编写了我的代码来使用像这样的瘦DI来实例化Eloquent Capsule / Manager
$container['db'] = function ($c) {
$settings = $c->get('database');
$db = new \Illuminate\Database\Capsule\Manager;
$db->addConnection($settings);
$db->setAsGlobal();
$db->bootEloquent();
return $db;
}
我有这样的路线
$app->get('/adduser', function() {
$user = new Users;
$user->name = "Users 1";
$user->email = "user1@test.com";
$user->password = "My Passwd";
$user->save();
echo "Hello, $user->name !";
});
当我在浏览器中运行路径时,它将在Web服务器错误日志
中产生错误PHP致命错误:在第3335行的/home/***/vendor/illuminate/database/Eloquent/Model.php中调用非对象上的成员函数connection()
在我看来,这是因为没有触发Eloquent Capsule / Manager被DI实例化。
我找到了一个解决方案来解决这个问题,方法是使用像这样的自定义构造函数声明Model
use Illuminate\Database\Eloquent\Model as Eloquent;
use Illuminate\Database\Capsule\Manager as Capsule;
class Users extends Eloquent {
protected $table = 'users';
protected $hidden = array('password');
public function __construct(Capsule $capsule, array $attributes = array())
{
parent::__construct($attributes);
}
}
但我不认为这是一个干净的解决方案,因为我必须使用自定义构造函数重写所有模型。
我需要帮助才能找到问题的解决方案。 我尝试使用以下代码:
$app->get('/adduser', function() use ($some_variable) {
// create user script
});
但到目前为止我不知道如何使用此方法触发$container['db']
。我非常感谢你的帮助。
答案 0 :(得分:2)
将胶囊管理员注入每个模型可能不是一个好主意。正如你自己说的那样,管理起来会很痛苦。 你是否在封闭之外尝试过这段代码?即。在你的应用程序的bootstrap部分..
$db = new \Illuminate\Database\Capsule\Manager;
$db->addConnection($settings);
$db->setAsGlobal();
$db->bootEloquent();
setAsGlobal
函数使Capsule Manager实例成为静态,因此模型可以全局访问它。
需要注意的是,约定是以单数形式命名模型类。即。用户而不是用户。