我在写作时遇到了Laravel 5.2应用程序的架构难题。该应用程序连接到生产中的多个数据库服务器我为所有开发人员设置了Vagrant环境,我们都将生产所需的数据提取到虚拟环境中,以确保数据库成为生产的镜像。当我们想要进行测试时会出现问题;我似乎无法以这样的方式设置应用程序:模型A(连接到DB1)和模型B(连接到DB2)都可以在同一个SQLite文件中测试(在repo pre中 - 型)。查看示例配置文件可能会更有意义:
我的数据库配置文件:
<?php
return [
'default' => 'platform',
'connections' => [
'platform' => [
'driver' => 'mysql',
'host' => env('PLATFORM_HOST'),
// ...
],
'product' => [
'driver' => 'mysql',
'host' => env('PRODUCT_HOST'),
// ...
],
'testing' => [
'driver' => 'sqlite',
'database' => storage_path().'/testing.db'
]
]
];
典型的平台模型:
<?php
namespace App\Platform;
use Illuminate\Database\Eloquent\Model;
class ModelA extends Model
{
protected $connection = 'platform';
protected $table = 'table_a';
}
典型的产品型号,非常相似:
<?php
namespace App\Product;
use Illuminate\Database\Eloquent\Model;
class ModelB extends Model
{
protected $connection = 'product';
protected $table = 'table_b';
}
我的问题的根本原因是模型的$connection
值会覆盖环境配置文件中设置的值,以及phpunit.xml
中设置的环境值。如果我没有在模型上设置$connection
值,它会使用为环境默认设置的任何内容...如果我正在测试平台模型,那就没问题了,因为这样做&#39;是默认连接。但是当我测试产品模型时,我必须做两件事之一,我都不关心:在模型构造函数中,检测testing
环境并执行$this->connection() = 'testing';
之类的操作;或者在我的setUp()
测试方法中,执行Config::set('database.connections.platform', Config::get('database.connections.testing'));
。
我觉得有六种方法可以做到这一点,其中没有一种非常干净。现在我采取第二种方法 - 使用Config
连接的Config
值覆盖非默认连接的testing
值 - 但我有点不喜欢&#39;我喜欢这样做。我考虑过切换到存储库模式,但我的模型方法的实现不会改变,只是他们在底层连接中使用的数据库类型。我还有什么可尝试的,我感到茫然。有什么建议吗?