如何在Slim 3.1依赖注入中触发Eloquent Manager

时间:2016-02-15 14:29:09

标签: php dependency-injection eloquent slim

我已经编写了我的代码来使用像这样的瘦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']。我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

将胶囊管理员注入每个模型可能不是一个好主意。正如你自己说的那样,管理起来会很痛苦。 你是否在封闭之外尝试过这段代码?即。在你的应用程序的bootstrap部分..

 $db = new \Illuminate\Database\Capsule\Manager;
 $db->addConnection($settings);
 $db->setAsGlobal();
 $db->bootEloquent();

setAsGlobal函数使Capsule Manager实例成为静态,因此模型可以全局访问它。 需要注意的是,约定是以单数形式命名模型类。即。用户而不是用户。