Laravel - 修改DB::connection方法

Laravel - Modify DB::connection method

我想修改 DB::connection 所以如果我正在 运行 测试它将覆盖给定的连接。

我在这样的模型中有很多硬编码连接 DB::connection('mysql2') 所以我想用 mysql_testing 覆盖 mysql2 连接。

我该怎么做?

我通常做的是在phpunit.xml中添加:

<env name="DB_CONNECTION" value="mysql_testing"/>

然后在 config/database.php 中,我创建了 mysql 连接的副本,如下所示:

'mysql_testing' => [
    'driver' => 'mysql',
    'host' => env('DB_TESTING_HOST', 'localhost'),
    'database' => env('DB_TESTING_DATABASE', 'forge'),
    'username' => env('DB_TESTING_USERNAME', 'forge'),
    'password' => env('DB_TESTING_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
],

然后在 .env 中定义测试连接设置:

#TESTING

DB_TESTING_HOST=127.0.0.1
DB_TESTING_DATABASE=test_database
DB_TESTING_USERNAME=root
DB_TESTING_PASSWORD=pass

它的工作没有任何问题而且你不需要在 .env 中切换任何东西,如果你是 运行 在同一个 machine/in 同一个目录[=23] 上手动测试和测试应用程序=]

编辑

如果你遇到这样的情况,修改多个模型可能不是最好的方法,但如果你想使用相同的数据库而不考虑连接集,你可以这样做:

假设您已将环境设置为测试可以使用以下功能完成的操作:

<env name="APP_ENV" value="testing"/>

在您的 phpunit.xml 文件中,您可以进入 AppServiceProvider class 并在 register 方法中执行如下操作:

if ($this->app->environment('testing')) {
    $this->app['config']->set('database.connections.mysql2.database', 'yourcustom testing database');
    // ... 
    $this->app['config']->set('database.connections.mysql15.database', 'yourcustom testing database');
}

我还没有尝试过,但它应该可以工作 - 它应该可以让 运行 测试时你可以将所有连接设置到同一个测试数据库(如果你愿意,也可以设置到其他数据库)