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

时间:2016-05-13 16:41:02

标签: php postgresql sqlite laravel lumen

在一个Lumen项目中,我需要在运行时创建数据库连接,但我一直在使用#34;数据库[...]未配置"错误,每次我尝试使用最近创建的连接。

这是我在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的任何信息。

我使用的是最新的流明版本。

2 个答案:

答案 0 :(得分:13)

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

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

正如Lumen configuration docs所述:

  

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中的连接数组来删除不需要的连接。

应用/配置/ 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);

答案 1 :(得分:0)

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

然后在里面复制@codege提到的关于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