Eloquent、slim 4 和 php-di(slim4 的桥梁)的数据库连接问题

问题描述 投票:0回答:1

我正在尝试使用 slim 4、php-di(slim 4 的桥梁)和 eloquent 构建一个测试后端。 特别是我想尝试连接到数据库(xampp 提供的 mysql)。尝试启动该程序时出现以下错误:

 Uncaught Error: Call to a member function connection() on null in C:\xampp\htdocs\smk-backend\vendor\illuminate\database\Capsule\Manager.php

这是我的index.php 文件:

<?php
(require_once __DIR__ . '/../config/bootstrap.php')->run();

这是我的 bootstrap.php 文件:

<?php

use App\Controllers\Home\HomeController;
use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;
use function DI\create;
use Illuminate\Database\Capsule\Manager;
require_once __DIR__ . '/../vendor/autoload.php';

$container = (new ContainerBuilder())
    ->addDefinitions([
        Defaults::class => create(Defaults::class),
        EloquentManager::class => create(EloquentManager::class),
        HomeController::class => create(HomeController::class)
        
    ])
    ->build();
$app = \DI\Bridge\Slim\Bridge::create();
$app->setBasePath('/smk-backend');
(require_once __DIR__ . '/routes.php')($app);

return $app;

这是我的defaults.php 文件:

<?php

class Defaults {
    private $dbSettings;

    public function __construct()
    {
        $this->dbSettings = [
            'database' => 'prova',
            'username' => 'root',
            'password' => '',
            'host' => '127.0.0.1:3306',
            'driver' => 'mysql',
            'charset'   => 'utf8mb4',
            'collation' => 'utf8mb4_general_ci',
            'prefix'    => '',
        ];
    }

    public function getDbSettings() {
        return $this->dbSettings;
    }
}

这是我的 eloquent.php 文件:

<?php 
use Slim\App; 
use Illuminate\Database\Capsule\Manager;

class EloquentManager {
    private $capsule;

    public function __construct(Defaults $defaults)
    {
        $capsule = new Manager;
        $capsule->addConnection($defaults->getDbSettings());
        $capsule->setAsGlobal();
        $capsule->bootEloquent();
        $this->capsule = $capsule;
    }
}

这是我的 HomeController.php 文件:

<?php

namespace App\Controllers\Home;

use Illuminate\Database\Capsule\Manager;
use Illuminate\Database\Query\Builder;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

final class HomeController
{
    protected $manager;
    public function __construct(Manager $manager) 
    {
        $this->manager = $manager;
    }

    public function index(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
    {
        $response->getBody()->write('Welcome!');

        return $response;
    }

    public function getTest(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface 
    {
        $prova = $this->manager->table('Test')->get();
        $response->getBody()->write(var_export($prova, true));

        return $response;
    }
}

最后这是我的routes.php 文件:

<?php
use Slim\App;
use App\Controllers\Home\HomeController;

return function (App $app)
{
    $app->get('/', [HomeController::class, 'getTest']);
};

除了index.php和HomeController.php之外,所有文件都位于同一文件夹中。 根据我对错误的理解,问题是没有与数据库创建连接。我尝试对配置(defaults.php 文件)进行一些更改,但似乎问题不存在。我有一种感觉,当调用构造函数时,HomeController 类对象什么也接收不到。我尝试使用自动装配

从 PowerShell 我可以毫无问题地连接到数据库

谢谢你

php eloquent slim php-di
1个回答
0
投票

我设法修复了我的代码。

这是我的新 bootstrap.php 文件:

<?php
use App\Controllers\Home\HomeController;
use DI\ContainerBuilder;
use function DI\autowire;
use DI\Bridge\Slim\Bridge;

require_once __DIR__ . '/../vendor/autoload.php';

$container = (new ContainerBuilder())
    ->addDefinitions([
        HomeController::class => autowire()
    ])
    ->build();
$app = Bridge::create($container);
$app->setBasePath('/smk-backend');
// boot eloquent
require_once __DIR__ . '/eloquent.php';
(require_once __DIR__ . '/routes.php')($app);

return $app;

我也从容器定义中删除了几个无用的类,并修复了最重要的错误:我没有在对 create 函数的调用中传递容器实例。我将

create
函数调用替换为
autowire
,其中添加了定义。

这是我的新 eloquent.php 文件:

<?php
    $dbSettings = [
        'database' => 'prova',
        'username' => 'root',
        'password' => '',
        'host' => '127.0.0.1:3306',
        'driver' => 'mysql',
        'charset'   => 'utf8mb4',
        'collation' => 'utf8mb4_general_ci',
        'prefix'    => ''
    ];
    $capsule = new Illuminate\Database\Capsule\Manager;
    $capsule->addConnection($dbSettings);
    $capsule->setAsGlobal();
    $capsule->bootEloquent();

最大的区别是它不再是一个类,现在还包含了整个数据库配置部分。我会评估是否将其移动到单独的配置文件中。

我还不清楚,当实例化

HomeController
类时,传递给构造函数的 Eloquent Manager 对象仍然保留用于连接的配置。我什至不清楚我应该如何使用向我建议的
Illuminate\Database\Connection
类。我认为每个文件中最后缺少的是
declare(strict_types=1)

© www.soinside.com 2019 - 2024. All rights reserved.