Php 如何在Slim 3.1依赖项注入中触发雄辩的管理器

Php 如何在Slim 3.1依赖项注入中触发雄辩的管理器,php,dependency-injection,eloquent,slim,Php,Dependency Injection,Eloquent,Slim,我已经编写了我的代码,使用slim DI来实例化雄辩的Capsule/Manager,如下所示 $container['db'] = function ($c) { $settings = $c->get('database'); $db = new \Illuminate\Database\Capsule\Manager; $db->addConnection($settings); $db->setAsGlobal(); $db-&g

我已经编写了我的代码,使用slim DI来实例化雄辩的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 !";
});
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);
    }
}
我的路线是这样的

$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 !";
});
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);
    }
}
当我在浏览器中运行路由时,它将在web服务器错误日志中产生错误

PHP致命错误:在第3335行的/home/***/vendor/illumb/database/Eloquent/Model.PHP中对非对象调用成员函数connection()

我认为这是因为雄辩的胶囊/管理器没有被DI触发实例化

我找到了一个解决方案,通过像这样用自定义构造函数声明模型

$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 !";
});
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']
。我真的很感谢您的帮助。

将胶囊管理器插入每个型号可能不是一个好主意。。正如你自己所说,这将是一个痛苦的管理。 你在闭包之外试过这个代码吗?即,在应用程序的引导程序部分

 $db = new \Illuminate\Database\Capsule\Manager;
 $db->addConnection($settings);
 $db->setAsGlobal();
 $db->bootEloquent();
setAsGlobal
函数使Capsule Manager实例处于静态状态,因此模型可以全局访问它。 请注意,惯例是以单数形式命名模型类。即用户而不是用户