我正在尝试使用 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 我可以毫无问题地连接到数据库
谢谢你
我设法修复了我的代码。
这是我的新 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)
。