使用 Laravel 的 Eloquent ORM 在 Slim 中出现空错误时调用成员函数 connection()

Call to a member function connection() on null error in Slim using Laravel's Eloquent ORM

我试图在 Slim 微框架上使用 Laravel 的 Eloquent ORM,但我一直看到错误:在 null[ 上调用成员函数 connection() =18=]

代码如下:

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(型号class)

use Illuminate\Database\Eloquent\Model as Model;

class User extends Model {

    protected $table = "users";

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

HomeController.php(控制器class)

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;
    }
}

dependency.php 需要进入我的 bootstrap.php 文件,其中 Slim class 是这样实例化的:

$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>';

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

您的全局 $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->db。如果您只使用 Eloquent 模型 class.

,则不会调用

在多连接上,试试这个:

$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();