插件窝 干货文章 Laravel多租户:如何自定义Stancl/Tenancy租户数据库连接主机?

Laravel多租户:如何自定义Stancl/Tenancy租户数据库连接主机?

租户 数据库 Database DatabaseConfig 609    来源:    2025-03-14

在使用 Stancl/Tenancy 包实现 Laravel 多租户时,默认情况下,租户的数据库连接会使用 .env 文件中配置的数据库主机(通常是 DB_HOST)。如果你想为每个租户自定义数据库连接主机,可以通过以下步骤实现。

1. 自定义租户数据库连接主机

Stancl/Tenancy 包允许你通过自定义 DatabaseConfig 类来覆盖默认的数据库连接配置。你可以通过以下步骤来实现:

1.1 创建自定义的 DatabaseConfig

首先,创建一个自定义的 DatabaseConfig 类,继承自 Stancl\Tenancy\DatabaseConfig 类,并覆盖 getConnectionDetails 方法。

namespace App\Tenancy\Database;

use Stancl\Tenancy\DatabaseConfig;
use Stancl\Tenancy\Contracts\Tenant;

class CustomDatabaseConfig extends DatabaseConfig
{
    public function getConnectionDetails(Tenant $tenant): array
    {
        // 获取默认的数据库连接配置
        $defaultConfig = parent::getConnectionDetails($tenant);

        // 自定义数据库主机
        $defaultConfig['host'] = $tenant->database_host; // 假设租户模型中有 database_host 字段

        return $defaultConfig;
    }
}

1.2 注册自定义的 DatabaseConfig

接下来,你需要在 AppServiceProviderTenancyServiceProvider 中注册这个自定义的 DatabaseConfig 类。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Stancl\Tenancy\DatabaseConfig;
use App\Tenancy\Database\CustomDatabaseConfig;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(DatabaseConfig::class, CustomDatabaseConfig::class);
    }
}

1.3 在租户模型中添加 database_host 字段

确保你的租户模型中有 database_host 字段,并且该字段存储了租户的数据库主机地址。

namespace App\Models;

use Stancl\Tenancy\Contracts\Tenant;
use Stancl\Tenancy\Database\Concerns\HasDatabase;
use Stancl\Tenancy\Database\Concerns\HasDomains;

class Tenant implements Tenant
{
    use HasDatabase, HasDomains;

    protected $fillable = [
        'database_host',
        // 其他字段...
    ];
}

2. 创建租户时设置数据库主机

在创建租户时,确保为每个租户设置 database_host 字段。

$tenant = Tenant::create([
    'database_host' => 'custom_host', // 自定义数据库主机
    // 其他字段...
]);

3. 测试

现在,当你切换到某个租户时,系统会自动使用该租户的 database_host 作为数据库连接的主机。

4. 注意事项

  • 确保 database_host 字段的值是有效的数据库主机地址。
  • 如果租户的数据库主机不同,确保这些主机能够被你的应用程序访问。
  • 如果数据库主机是动态的,确保在租户创建或更新时正确设置 database_host 字段。

通过以上步骤,你可以为每个租户自定义数据库连接主机,从而实现更灵活的多租户数据库管理。