【问题标题】:Call to a member function connection() on null error in Slim using Laravel's Eloquent ORM使用 Laravel 的 Eloquent ORM 在 Slim 中调用成员函数 connection()
【发布时间】:2016-11-10 10:35:49
【问题描述】:

我正在尝试在 Slim 微框架上使用 Laravel 的 Eloquent ORM,但我一直看到错误:Call to a member function connection() on null

代码如下:

dependency.php

$container['db'] = function($container) {
    $capsule = new \Illuminate\Database\Capsule\Manager;
    $capsule->addConnection($container->get('settings')['database']);

    $capsule->setAsGlobal();
    $capsule->bootEloquent();

    return $capsule;
};

User.php(模型类)

use Illuminate\Database\Eloquent\Model as Model;

class User extends Model {

    protected $table = "users";

    protected $fillable = ['name', 'email', 'password'];
}

HomeController.php(控制器类)

class Home extends Controller {

public function index($request, $response, $args) {
        $user = User::find(1);
        var_dump($user);
        die();
        $title = "Slim Auth";
        $response = $this->view->render($response, 'home.php', ["title" => $title]);
        return $response;
    }
}

在我的 bootstrap.php 文件中需要dependency.php,在该文件中实例化了 Slim 类:

$config = [
    'settings' => [
        'displayErrorDetails' => true,

        'view' => [
            'view_path' => APP_PATH . 'views/'
        ],

        'database' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'tutorial_slim_auth',
            'username'  => 'root',
            'password'  => 'passw0rd',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ],
    ]
];

$app = new Slim\App($config);

而 HomeController.php 和 User.php 是通过 composer json 文件自动加载的。运行 index.php(其中还包括我的 bootstrap.php)文件后包含:

$app->run();

这给了我一个致命错误:在 null 上调用成员函数 connection()。 但是这样做:

echo '<pre>';
print_r($container['db']);
echo '</pre>';

在我的引导文件中产生了预期的结果以及在 HomeController.php 文件中调用的 var_dump 函数的结果。我该怎么办?还是我做错了什么?

【问题讨论】:

  • 一个脱离上下文的问题,为什么不使用 lumen,它是一个微框架,并且支持 Eloquent ORM?
  • 能否请您添加异常的完整堆栈?

标签: laravel orm eloquent slim


【解决方案1】:

你的全局 $capsule 封装在这里:

$container['db'] = function($container) {
    $capsule = new \Illuminate\Database\Capsule\Manager;
    $capsule->addConnection($container->get('settings')['database']);

    $capsule->setAsGlobal();
    $capsule->bootEloquent();

    return $capsule;
};

试试这个:

$capsule = new \Illuminate\Database\Capsule\Manager;
$capsule->addConnection($container['settings']['db']);
$capsule->setAsGlobal();
$capsule->bootEloquent();

$container['db'] = function ($container) use ($capsule) {
    return $capsule;
};

第一个版本不起作用的原因是该函数仅在您实际使用胶囊时才被调用,即$this-&gt;db。如果您只使用 Eloquent 模型类,则不会进行调用。

【讨论】:

  • 知道为什么会这样吗?我遇到了完全相同的问题。
  • 如何再添加一个到另一个数据库的连接?在使用查询生成器进行查询时,如何判断何时要使用这两个连接之一?
  • 完美。你能解释一下为什么会这样吗?
【解决方案2】:

在多个连接上,试试这个:

$dbconfig = $ci->settings['db'];

$capsule = new \Illuminate\Database\Capsule\Manager;

foreach ($dbconfig['connections'] as $cname => $connection)
{
    $cname = $cname == $dbconfig['default'] ? 'default' : $cname;

    $capsule->addConnection($connection, $cname);
}

$capsule->setFetchMode($dbconfig['fetch']);
$capsule->setAsGlobal();
$capsule->bootEloquent();

$ci['db'] = function ($ci) use($capsule) {
    return $capsule;
};

然后

DB::connection('other_connection')->table('...')->get();

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 2019-01-12
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多