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

Posted

技术标签:

【中文标题】Lumen - 在运行时创建数据库连接【英文标题】:Lumen - Create database connection at runtime 【发布时间】:2016-09-09 23:04:19 【问题描述】:

在 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 版本。

【问题讨论】:

lumen.laravel.com/docs/5.2/database @ClaudioKing 我已经阅读了文档,但如果没有说明运行时的数据库连接。 我们如何使用 $config = $app->make('config');在控制器的行动中?请告诉我。谢谢。 【参考方案1】:

您要使用的方法存在一个主要问题:

您没有初始化任何配置对象。默认情况下,Lumen 没有设置传统的配置对象,直到您在根文件夹中创建 config 目录。

如Lumen configuration docs中所写:

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

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

要使该对象和您的新 retail_db 数据库连接正常工作:

在您的项目根目录中创建一个config 文件夹 将文件vendor/laravel/lumen-framework/config/database.php复制到这个配置文件夹 用$app-&gt;configure('database');初始化bootstrap/app.php中的数据库配置对象(放在第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 这就是我需要的。但是出于好奇,我怎样才能删除新创建的连接? 对于删除只有一种方法,将其设置为 null - 我更新了,我的答案。 我们如何使用 $config = $app->make('config');在控制器的行动中?请告诉我。谢谢。 将 database.php 文件放在 config/database.php 而不是 app/config/database.php 位置,不要忘记在 .env 文件中注释/删除 db 凭据并通过命令行重新启动 lumen 服务.有用。谢谢@codedge。 您好,我使用的是 Lumen 8.2.3,当我创建新项目时,我没有看到 config/database.php 或配置文件,我应该创建一个新的吗?或者有创建配置文件的命令?谢谢【参考方案2】:

回答@jhon 的问题 Lumen 没有提供该配置文件夹,您需要在根目录下创建名为 config 的新目录。

然后在里面复制@codedge提到的关于database.php文件的内容

将文件 vendor/laravel/lumen-framework/config/database.php 复制到这个配置文件夹中

在终端中按照以下命令创建config 目录并复制database.php 文件

user$ cd projectPath/
user$ mkdir config
user$ cp vendor/laravel/lumen-framework/config/database.php config/database.php

其中 此配置文件夹 是您刚刚创建的 config 目录。 所以它看起来像下面的图像。 folder structure

【讨论】:

以上是关于Lumen - 在运行时创建数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

带有测试输出的 Lumen 5.1 播种

Bcrypt 在 Lumen 5.4 中不起作用:调用未定义的函数 bcrypt()

Lumen 5.2 中未定义命令“make:seeder”

无法从工匠命令 Laravel/Lumen 进行 Crypt::decrypt

Lumen Composer 无法检测新创建项目中的供应商文件夹

控制台生命周期中的 Lumen 自定义中间件