【问题标题】:Slim 3 Eloquent initialization error Argument 1 must be Illuminate\Database\Capsule\ManagerSlim 3 Eloquent 初始化错误 Argument 1 must be Illuminate\Database\Capsule\Manager
【发布时间】:2016-05-26 06:48:17
【问题描述】:

披露:这是我的第一个 Slim 应用

我尝试将 Eloquent 与 Slim 3 一起使用,但似乎无法正常工作。我已经用 composer 安装了所有东西,并按照网站上的安装指南进行操作。

当我尝试使用我的用户模型(它扩展了 Eloquent 模型)时,我收到了一个致命错误:

致命错误:在第 3280 行的 ****\vendor\illuminate\database\Eloquent\Model.php 中调用 null 上的成员函数 connection()

我的 appConfig 如下所示:

$config['db'] = [
    'driver'    => 'mysql',
    'host'      => '****',
    'database'  => '****',
    'username'  => '****',
    'password'  => '****',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
];

我根据文档传递给应用程序:

$app = new \Slim\App(["settings" => $config]);
$container = $app->getContainer();
$container['db'] = function (ContainerInterface $container) {
    $settings = $container->get('database');
    $capsule = new \Illuminate\Database\Capsule\Manager;
    $capsule->addConnection($settings);
    $capsule->setAsGlobal();
    $capsule->bootEloquent();

    return $capsule;
};

我的用户类如下所示:

class User extends Illuminate\Database\Eloquent\Model {}

我在Stackoverflow 上找到了一种解决方法,如下所示:

use Illuminate\Database\Eloquent\Model as Eloquent;
use Illuminate\Database\Capsule\Manager;

    class User extends Eloquent {
            public function __construct(Manager $capsule, array $attributes = [])
        {
            parent::__construct($attributes);
        }
    }

但是如果我根据端口重写构造函数,我会得到一个不同的错误:

_Catchable 致命错误:传递给 Up\models\User::_construct() 的参数 1 必须是 Illuminate\Database\Capsule\Manager 的实例,没有给出,在 ****\vendor\ 中调用在第 644 行照亮\database\Eloquent\Model.php 并在第 14 行的 ****\models\User.php 中定义

我现在卡住了。请帮忙

【问题讨论】:

  • $capsule->addConnection($container->get('database')); != $capsule->addConnection($config['db']);

标签: php eloquent slim


【解决方案1】:

我找到了解决方案here,但似乎有点不合适。我只需要像这样单独初始化 Eloquent:

$capsule = new Capsule;
$capsule->addConnection($config['db']);
$capsule->setEventDispatcher(new Dispatcher(new Container));
$capsule->bootEloquent();

这样$container['db'] = function () {} 部分被排除在外,但现在一切正常

编辑(对于 cmets):整个部分现在看起来像这样:

$app = new \Slim\App(["settings" => $config]);
$container = $app->getContainer();
/*$container['db'] = function (ContainerInterface $container) {
    $settings = $container->get('database');
    $capsule = new \Illuminate\Database\Capsule\Manager;
    $capsule->addConnection($settings);
    $capsule->setAsGlobal();
    $capsule->bootEloquent();

    return $capsule;
};*/

$capsule = new Capsule;
$capsule->addConnection($config['db']);
$capsule->setEventDispatcher(new Dispatcher(new Container));
$capsule->bootEloquent();

【讨论】:

  • 问题是容器只有在被调用时才执行函数中的代码......所以如果你有一个模型,并且没有任何调用 db eloquent 永远不会启动:)
  • 没有得到你所说的“必须单独初始化 Eloquent”,你能补充更多细节吗?
  • @Biguá 我刚刚做了 ;)
  • 从那时起,文档更新了更好的示例,现在很清楚,$capsule->bootEloquent(); 调用丢失了(来自原始文档)。
猜你喜欢
  • 2015-10-12
  • 2016-12-31
  • 2021-11-15
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2019-05-25
  • 1970-01-01
相关资源
最近更新 更多