Lumen - 运行时创建数据库连接

13
在Lumen项目中,我需要在运行时创建数据库连接,但每次尝试使用最近创建的连接时都会收到“未配置的数据库”错误消息。
这是routes.php上我的测试代码:

在Lumen项目中,我需要在运行时创建数据库连接,但每次尝试使用最近创建的连接时都会收到“未配置的数据库”错误消息。

这是我的routes.php上的测试代码:

<?php

$app->get('/', function () use ($app) {

    $config = $app->make('config');
    $config->set('database.connections.retail_db', [
        'driver'   => 'pgsql',
        'host'     => env('RETAIL_DB_HOST', 'localhost'),
        'port'     => env('RETAIL_DB_PORT', 5432),
        'database' => env('RETAIL_DB_DATABASE', 'forge'),
        'username' => env('RETAIL_DB_USERNAME', 'forge'),
        'password' => env('RETAIL_DB_PASSWORD', ''),
        'charset'  => env('RETAIL_DB_CHARSET', 'utf8'),
        'prefix'   => env('RETAIL_DB_PREFIX', ''),
        'schema'   => env('RETAIL_DB_SCHEMA', 'public'),
    ]);
    return app('db')->connection('retail_db')->select("SELECT * FROM users");

});

这段代码应该可以在Laravel上工作,但是我找不到任何关于Lumen的信息。

我正在使用最新版本的Lumen。


https://lumen.laravel.com/docs/5.2/database - Claudio King
@ClaudioKing 我已经阅读了文档,但它没有提到关于运行时的数据库连接。 - BernalCarlos
在控制器的操作中,我们如何使用 $config = $app->make('config');?请告诉我。谢谢。 - Kamlesh
2个回答

30

你采用的方法存在一个主要问题:

你没有初始化任何配置对象。Lumen默认情况下没有传统的配置对象设置,除非你在根目录中创建一个config目录。

正如在Lumen配置文档中所写:

Lumen框架的所有配置选项都存储在.env文件中。

你所采用的方法需要使用Laravel中使用的传统配置对象。

为了获得该对象和您新的retail_db数据库连接:

  • 在项目根目录中创建一个config文件夹
  • 将文件vendor/laravel/lumen-framework/config/database.php复制到此配置文件夹中
  • bootstrap/app.php中使用$app->configure('database');初始化数据库配置对象(将其放置在第28行)

现在你的文件结构看起来像这样:

├── app
├── bootstrap
├── config
   └── database.php
├── database
├── public
├── resources
├── storage
├── tests
└── vendor

当然,您可以通过注释或完全删除来自 app/config/database.php 中的连接数组中不需要的连接。

app/config/database.php

'connections' => [

        /*'testing' => [
            'driver' => 'sqlite',
            'database' => ':memory:',
        ],*/

        'sqlite' => [
            'driver'   => 'sqlite',
            'database' => env('DB_DATABASE', base_path('database/database.sqlite')),
            'prefix'   => env('DB_PREFIX', ''),
        ],

        'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'port'      => env('DB_PORT', 3306),
            'database'  => env('DB_DATABASE', 'forge'),
            'username'  => env('DB_USERNAME', 'forge'),
            'password'  => env('DB_PASSWORD', ''),
            'charset'   => env('DB_CHARSET', 'utf8'),
            'collation' => env('DB_COLLATION', 'utf8_unicode_ci'),
            'prefix'    => env('DB_PREFIX', ''),
            'timezone'  => env('DB_TIMEZONE', '+00:00'),
            'strict'    => env('DB_STRICT_MODE', false),
        ],
]

使用更改后的 bootstrap/app.php

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../')
);

//$app->withFacades();
// $app->withEloquent();

$app->configure('database');

现在你可以在 routes.php 中使用已有的代码。

要删除你的 retail_db 连接,只需将其设置为 null

$config->set('database.connections.retail_db', null);

谢谢@codedge,这正是我需要的。但出于好奇,我该如何删除新创建的连接? - BernalCarlos
1
删除的唯一方法是将其设置为null - 我更新了我的答案。 - codedge
在控制器的操作中,我们如何使用 $config = $app->make('config');?请告诉我。谢谢。 - Kamlesh
将database.php文件放置在config/database.php而不是app/config/database.php位置,并且不要忘记在.env文件中注释/删除数据库凭据并通过命令行重启Lumen服务。它有效。感谢@codedge。 - Kamlesh
你好,我正在使用 Lumen 8.2.3 版本。当我创建新项目时,我没有看到 config/database.php 或者其他配置文件,我应该自己创建一个吗?还是有命令可以创建配置文件?谢谢。 - jhon

1
为了回答 @jhon 的问题,Lumen不提供config文件夹,你需要在根目录下创建名为 config 的新目录。然后在其中复制 @codedge 关于 database.php 文件的内容。
请在终端中按照以下命令创建 config 目录并复制 database.php 文件。
user$ cd projectPath/
user$ mkdir config
user$ cp vendor/laravel/lumen-framework/config/database.php config/database.php

这里的配置文件夹是您刚刚创建的config目录,因此它看起来像下面的图片。 文件夹结构


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接